Как включить привязки во время запроса Editor.GetEntity ?

Автор Тема: Как включить привязки во время запроса Editor.GetEntity ?  (Прочитано 2145 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Запрос GetEntity позволяет получить не только объект чертежа, но и точку по которой кликнул пользователь. Однако точно указать нужную точку на объекте очень сложно, потому что Автокад зачем-то принудительно отключает привязки во время запроса. Можно вручную вызвать некоторые привязки, но это очень неудобно и не все они включаются. Можно ли как-то исправить этот баг и заставить Автокад работать с привязками во время выбора объекта? Желательно, конечно, чтоб работали привязки только к объектам из AddAllowedClass, но это уже не так важно.
Пока приходится менять запрос на GetPoint и с большим трудом искать объект под этой точкой.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
Пока приходится менять запрос на GetPoint

А если в 2 действия, сперва GetEntity, затем GetPoint на выбранном объекте?

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

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
А если в 2 действия
Это ж ровно в 2 раза больше кликов, да еще и по одному и тому же месту. Ужас! :)

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
ков, да еще и по одному и тому же месту. Ужас!
Если не часто кликать то норм.

Пока приходится менять запрос на GetPoint и с большим трудом искать объект под этой точкой.
Я использовал нечто подобное в цивил. Пользователь, методом GetPoint указывал точку, если точка попадала на точку CoGo, то вызывалось редактирование, если не попал, то создание новой точки CoGo. Попадание на точку проверял по расстоянию между указанной точкой и всеми точками Cogo. Минимальное расстояние, для определения попадания, подобрал опытным путем и вывел в настройки.

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

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Пользователь, методом GetPoint указывал точку, если точка попадала на точку CoGo, то вызывалось редактирование
Я так и сделал - поиск пересечения линии вида через эту точку со всеми объектами чертежа. Приходится как-то извращаться, ограничивать количество объектов. Если в чертеже сотни тысяч объектов, то пересечение можно искать слишком долго... В общем, если б был способ в GetEntity включить привязки, это было б гораздо лучше. Но увы...

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
поиск пересечения линии вида через эту точку со всеми объектами чертежа. Приходится как-то извращаться, ограничивать количество объектов.
чтоб работали привязки только к объектам из AddAllowedClass

Всеми или только определенными объектами? Если определенными, то предварительную выборку можно немного ускорить.

Оффлайн Валерий Ивлев

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
avc, я бы запомнил значение переменной OSMODE до выбора, назначил нужные тебе привязки и вернул бы первоначальное значение назад после выбора.
А если нужно что-то "специфическое" то можно использовать статью: https://www.keanw.com/2008/10/implementing-a.html

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

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
я бы запомнил значение переменной OSMODE до выбора, назначил нужные тебе привязки
Весь вопрос в том, как включить привязки во время работы метода GetEntity. Он их все принудительно отключает. Он так работает и во всех встроенных командах - если команда запрашивает объект, а не точку, то привязки отключаются.

Оффлайн Валерий Ивлев

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Попробовал спросить ChatGPT, говорит что GetEntity не позволит управлять привязками и предложил через другой метод:
Код - C# [Выбрать]
  1. [CommandMethod("GetSelectionWithPickedPoint")]
  2. public void GetSelectionWithPickedPoint()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Editor ed = doc.Editor;
  6.  
  7.     Point3d pickedPoint = Point3d.Origin;
  8.  
  9.     // Подписка на событие PointMonitor
  10.     ed.PointMonitor += (sender, args) =>
  11.     {
  12.         if (args.Context != null)
  13.         {
  14.             pickedPoint = args.Context.ComputedPoint; // Получение текущей точки
  15.         }
  16.     };
  17.  
  18.     try
  19.     {
  20.         // Настраиваем параметры выбора
  21.         PromptSelectionOptions selOpts = new PromptSelectionOptions
  22.         {
  23.             MessageForAdding = "\nВыберите объект: "
  24.         };
  25.  
  26.         // Получаем результат выбора
  27.         PromptSelectionResult selResult = ed.GetSelection(selOpts);
  28.         if (selResult.Status == PromptStatus.OK)
  29.         {
  30.             foreach (SelectedObject selObj in selResult.Value)
  31.             {
  32.                 if (selObj != null)
  33.                 {
  34.                     ed.WriteMessage($"\nВыбран объект с ID: {selObj.ObjectId}");
  35.                     ed.WriteMessage($"\nКоординаты точки выбора: {pickedPoint}");
  36.                 }
  37.             }
  38.         }
  39.     }
  40.     catch (System.Exception ex)
  41.     {
  42.         ed.WriteMessage($"\nОшибка: {ex.Message}");
  43.     }
  44.     finally
  45.     {
  46.         // Отписка от события
  47.         ed.PointMonitor -= (sender, args) => { };
  48.     }
  49. }
  50.  

Сам, к сожалению, пока не успел проверить. На первый взгляд вроде норм...

Другой вариант - по ссылке: https://forums.autodesk.com/t5/net/editor-getentity-and-pickpointselectedsubobject/m-p/7298212#M54663

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

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Проверил. GetSelection еще хуже. Привязки он тоже отключает. Но при этом позволяет выделять рамкой и лассо даже в режимах SingleOnly и SinglePickInSpace. То есть нельзя заставить его работать в режиме выбора одним кликом. Это еще можно было бы пользователям объяснить, что не надо рамку запускать, но привязки...

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

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
        // Отписка от события
        ed.PointMonitor -= (sender, args) => { };
Попутно вопрос знатокам по этому коду: если адрес новой безымянной функции передать оператору -= , он что, в самом деле найдет какую-то другую безымянную функцию и удалит ее из списка делегатов события? Похоже на бред AI

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
если адрес новой безымянной функции передать оператору -= , он что, в самом деле найдет какую-то другую безымянную функцию и удалит ее из списка делегатов события? Похоже на бред AI
Вы не сможете легко отписаться от события, если использовали анонимную функцию для подписки на него. Чтобы отписаться от события в этом случае, вернитесь к коду, где вы подписались на событие, сохраните анонимную функцию в переменной делегата, а затем добавьте делегат к событию. Мы не рекомендуем использовать анонимные функции для подписки на события, если вам нужно будет отписаться от события в какой-то более поздней точке кода.
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events

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

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Вы не сможете легко отписаться от события
Что и требовалось доказать - очевидный бред AI. Мне прям резануло глаз, а народ-то хавает. Я представляю сколько теперь такого говнокода используется...
p.s. Зато Скайнет нам пока не грозит :)

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
Зато Скайнет нам пока не грозит
грозит но в более плохом виде, чем описано в фантастике:
1. Люди создали огромный дата центр, который контролирует все и заменяет многое.
2. Люди потеряли работу и мировая экономика схлапывается.
3. Человечество "деградирует".
4. Некому обслуживать дата центр, нет того, кто понимает где и как его обучать.
5. Стоит огромная ржавая развалина поросшая растительностью, вокруг пастухи пасут коз, охотники охотятся с луком на зайцев.
...все быстро меняется. Все что не успевает подстроиться под изменения пропадет.

Как мне видится проблемы:
1. ИИ интересен в первую очередь тем, кто производит оборудование и ИИ модели+агрессивный маркетинг.
2. ИИ позволит сделать огромный прогресс в определенных областях но дальше все успокоятся. Как с полетами в космос, побаловались, пофантазировали. Дальше интересненько, но дорого.
3. ИИ может не все, с точки зрения генерации кода. Представьте себе запросы: "Сделай мне виндовс", "Напиши автокад", "Мне нужен фотошоп". Страшно представить результат работы ИИ по абстрактному запросу. В итоге ТЗ - многотомное сочинение? Чем это лучше сегодняшнего подхода с языками программирования? А самое главное как менять код, каждый раз генерировать по новому из многотомного запроса и получать различные варианты?  Тут явно требуется смешанный подход.
4. Изменения. Как мы видим меняются архитектуры процессоров, языки программирования, API. и т.д. и процессу нет конца. ИИ могут обучать только опытные люди, в самообучающееся ИИ я лично не верю.

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
avc,
Простейший вариант перед GetEntity послать в командную строку ключевые слова привязок (через SendStringToExecute). Они сработают как раз при выборе объекта.
Альтернативный вариант - получить точку с учетом привязок. В ObjectARX это делается при помощи acedOsnap.
Как в .NET не помню и возможности посмотреть сейчас нет. В крайнем случае воспользуешься P/INVOKE.
Или всё-таки это Editor.Snap
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение