Найти объект под заданной точкой

Автор Тема: Найти объект под заданной точкой  (Прочитано 13140 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Найти объект под заданной точкой
« Ответ #15 : 27-10-2015, 17:21:48 »
Сдвинуть или отключить - не важно. Заковырка не в этом, а в том, что надо как-то обновить изображение перед вызовом поиска объекта.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Найти объект под заданной точкой
« Ответ #16 : 27-10-2015, 17:31:04 »
Сдвинуть или отключить - не важно. Заковырка не в этом, а в том, что надо как-то обновить изображение перед вызовом поиска объекта.
Если разделишь транзакцию на две, то не придётся выполнять регенерацию, которая может быть достаточно длительной операцией. По поводу отключить или передвинуть - согласен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Найти объект под заданной точкой
« Ответ #17 : 27-10-2015, 17:45:18 »
А подскажете код EntryPoint этой функции (acedNEntSelPEx) для Acad 2012x64 ?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Найти объект под заданной точкой
« Ответ #18 : 27-10-2015, 17:47:22 »
А подскажете код EntryPoint этой функции (acedNEntSelPEx) для Acad 2012x64 ?
"?acedNEntSelPEx@@YAHPEB_WQEA_JQEANHQEAY03NPEAPEAUresbuf@@IPEA_J@Z"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Найти объект под заданной точкой
« Ответ #19 : 02-11-2015, 15:57:57 »
Замечу еще одну особенность применения функции acedNEntSelPEx. Она возвращает вовсе не тот объект, который находится точно под заданной точкой. Она выбирает первый попавшийся (в порядке DrawOrder) объект, среди всех объектов попавших в квадрат перекрестья курсора (PickBox). Даже если сработала привязка к точке на одном объекте, на выходе функции будет другой объект. А пользователь скорее всего не заметит, что выбран не тот объект, т.к. они расположены очень близко (pickbox обычно всего 3 пиксела на экране). "Виртуальный" пикбокс учитывается даже в случае, если точка передается в функцию извне.
Исправить этот баг не сложно. Я просто ставлю системную переменную PICKBOX на 0 (AcadApp.SetSystemVariable("PICKBOX", 0)) на время вызова функции, и возвращаю ее обратно по завершении. В try-finally, конечно.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Найти объект под заданной точкой
« Ответ #20 : 02-11-2015, 16:03:43 »
Она возвращает вовсе не тот объект, который находится точно под заданной точкой. Она выбирает первый попавшийся (в порядке DrawOrder) объект, среди всех объектов попавших в квадрат перекрестья курсора (PickBox).
Точно также работают и acedEntsel (Editor.GetEntity), acedNentsel(p) (Editor.GetNestedEntity). Это стандарт AutoCAD с незапамятных времён...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн aipx

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Re: Найти объект под заданной точкой
« Ответ #21 : 24-04-2016, 17:22:04 »
Я начинающий в написании плагинов, не судите строго если вопрос будет сформулирован не верно:
У меня есть модель на которой размещены блоки с указателями их названий мультивыноской, мне нужно создать  SortedDictionary<TKey, TValue> Блок-Название.

С помощью метода указанного в данном посте, я нахожу координаты Point3d мультивыносок, которые я получаю командой -  Mleader.FirstVertex(0) ( я так понимаю координаты мне передаются с  ModelSpace ). При этом хотелось бы получить объекты под всеми мультивыносками модели, что бы это не зависило от того насколько я отмасштабировал модель, а оно ищет только в том участке который виден на экране.  Подскажите хотя бы в каком направлении копать? Я предпологаю, что это связано с видовыми экранами и системами координат, но описать не могу  :(

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Найти объект под заданной точкой
« Ответ #22 : 24-04-2016, 17:36:17 »
aipx
Приветствую на форуме!
Обозначенный алгоритм работает только с примитивами в видимой области экрана. Так что если тебя это не устраивает нужно думать о другом алгоритме.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Найти объект под заданной точкой
« Ответ #23 : 24-04-2016, 17:38:58 »
Например, отбираешь все свои блоки в модели и все свои мультивыноски в модели. Ну а дальше находишь соответствие их друг другу (опираясь на точки вставки блоков и начало мультивыноски)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн aipx

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Re: Найти объект под заданной точкой
« Ответ #24 : 24-04-2016, 17:48:08 »
Александр Ривилис, Очень благодарен за помощь! Вы мне сэкономили кучу времени, на протяжении которого я бы ковырялся еще в этом коде. Буду думать в другом направлении!

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

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Найти объект под заданной точкой
« Ответ #25 : 25-05-2016, 23:22:00 »
Буду думать в другом направлении!
Необязательно!
Я наконец нашел время решить эту проблему с поиском объектов за экраном и все оказалось проще простого. Перед поиском объектов надо:
1. Для выносок в пространстве бумаги надо выйти из вьюпорта:
Код - C# [Выбрать]
  1.             if (mleader.BlockName != "*Model_Space") { db.TileMode = false;  ed.SwitchToPaperSpace(); }
2. Вывести все объекты на экран
Код - C# [Выбрать]
  1.             ZoomExtents();  ed.UpdateScreen();
ZoomExtents приходится вызывать через маленький танец с бубном
Код - C# [Выбрать]
  1.     public static void ZoomExtents()
  2.     {
  3.       object acadObject = Application.AcadApplication;
  4.       acadObject.GetType().InvokeMember("ZoomExtents", BindingFlags.InvokeMethod, null, acadObject, null);
  5.     }
Все это безусловно костыли. Настройки вида мы пользователю по портим. По хорошему надо писать свой метод поиска объектов в заданной точке, точнее на пересечении осью Z текущего вида. А связывать объекты через XData или как-то еще "не геометрически" - по моему гораздо более  тернистый путь. Придется отлавливать любые модификации этих объектов. И как гарантировать, что эти модификации не произошли на компьютере, где нет нашего плагина?