Двойной клик по блоку. Как заменить редактор на свою команду при условии?

Автор Тема: Двойной клик по блоку. Как заменить редактор на свою команду при условии?  (Прочитано 12693 раз)

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Стоит задача - при двойном клике по блоку, если в блоке есть нужные расширенные данные, запустить специальное окно. Иначе - пусть работает как настроено у пользователя.
Нашел пример с похожим описанием, но мне совершенно не нравится подход менять макрос во всех загруженных cui

Еще вариант - сменить значение переменной DBLCLKEDIT, отключив редактор блоков. Но и это неправильный подход.

Можно как-то обработать нужные мне действия прям в обработчике события BeginDoubleClick? У меня пока не получилось

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я так понимаю, что это всё в контексте Custom Entity на .NET? Вот тебе первый возможный тупик. В BeginDoubleClick точно ты уже ничего не сделаешь. Т.е. перехватывать нужно раньше и в случае если это твой блок не допускать попадания в BeginDoubleClick, а выполнять собственную обработку. Ты же не знаешь на что у пользователя может быть настроен DoubleClick на блок.
Не исключаю, что тебе поможет это: http://adn-cis.org/kak-realizovat-windows-xuk-s-ispolzovaniem-acedregisterfilterwinmsg-v-.net.html
Но уверенности нет. Возможно поможет событие Application.PreTranslateMessage.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Придумал вот такой вариант:
Код - C# [Выбрать]
  1. public static class AxisFunction
  2. {
  3.     /// <summary>Имя примитива, помещаемое в XData</summary>
  4.     public const string MPCOEntName = "mpAxis";
  5.     /// <summary>Отображаемое имя примитива</summary>
  6.     public const string MPCOEntDisplayName = "Прямая ось";
  7.  
  8.     public static void Initialize()
  9.     {
  10.         // Ненужное убрал
  11.         // Подписываюсь на события
  12.         AcApp.BeginDoubleClick += AcApp_BeginDoubleClick;
  13.         AcApp.DocumentManager.DocumentLockModeChanged += DocumentManager_DocumentLockModeChanged;
  14.     }
  15.  
  16.     private static bool UseBedit = true;    
  17.  
  18.     private static void DocumentManager_DocumentLockModeChanged(object sender, Autodesk.AutoCAD.ApplicationServices.DocumentLockModeChangedEventArgs e)
  19.     {
  20.         if(!UseBedit)
  21.         if (e.GlobalCommandName == "BEDIT")
  22.         {
  23.             e.Veto();
  24.         }
  25.     }
  26.  
  27.     private static void AcApp_BeginDoubleClick(object sender, Autodesk.AutoCAD.ApplicationServices.BeginDoubleClickEventArgs e)
  28.     {
  29.         PromptSelectionResult psr = AcadHelpers.Editor.SelectAtPickBox(e.Location);
  30.         if (psr.Status != PromptStatus.OK) return;
  31.         ObjectId[] ids = psr.Value.GetObjectIds();
  32.         if (ids.Length == 1)
  33.         {
  34.             var location = e.Location;
  35.             using (AcadHelpers.Document.LockDocument())
  36.             {
  37.                 using (Transaction tr = AcadHelpers.Database.TransactionManager.StartTransaction())
  38.                 {
  39.                     var obj = tr.GetObject(ids[0], OpenMode.ForWrite);
  40.                     if (obj is BlockReference blockReference &&
  41.                         ExtendedDataHelpers.IsMPCOentity(blockReference, AxisFunction.MPCOEntName))
  42.                     {
  43.                         UseBedit = false; // Запрет работы редактора блоков
  44.                         var axis = AxisXDataHelper.GetAxisFromEntity(blockReference);
  45.                         axis.UpdateEntities();
  46.                         if (MainStaticSettings.Settings.AxisUsePluginTextEditor)
  47.                         {
  48.                             AxisValueEditor axisValueEditor = new AxisValueEditor {Axis = axis};
  49.                             axisValueEditor.ShowDialog();
  50.                         }
  51.                         else
  52.                         {
  53.                             // тут будет обычный редактор текста
  54.                         }
  55.                     }
  56.                     else UseBedit = true; // Пусть работает редактор блоков
  57.                     tr.Commit();
  58.                 }
  59.             }
  60.         }
  61.     }
  62.  
  63.     public static void Terminate()
  64.     {
  65.         // .....
  66.     }
  67. }

При поверхностном тестировании работает

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Придумал вот такой вариант:
1. А если это блок с атрибутами?
2. Если переназначено действие не на _BEDIT?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
1. А если это блок с атрибутами?
Значит это не мой блок и все сработает так как надо. Проверил
2. Если переназначено действие не на _BEDIT?
Вот тут конечно не проверял. Но я с таким даже и не сталкивался ни разу )) В этом случае сначала сработает мой вариант, а после сработает то, что у пользователя настроено

Записал гифку как сейчас получается. Нужно еще потестить конечно, но пока все годно

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Записал гифку как сейчас получается
1. Хорош "писать гифки". Ты знаешь как нужно записывать видео для нашего форума. Если не знаешь - читай у меня в подписи.
2. По поводу блока с атрибутами и без ты не прав. По-умолчанию для блока с атрибутами по doubleclick запускается команда _EATTEDIT, а для блока без атрибутов - команда _BEDIT:

3. Если уж ты не хочешь делать так, как я предложил, то можешь в BeginDoubleClick ставить флажок запрета следующей команды, какая бы она ни была, если это твой блок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
1. Хорош "писать гифки". Ты знаешь как нужно записывать видео для нашего форума. Если не знаешь - читай у меня в подписи.
У меня браузер упорно не показывает видео screencast'а. Да и вообще сервис корявый со всех возможных сторон. Но я постараюсь перебороть себя
2. По поводу блока с атрибутами и без ты не прав. По-умолчанию для блока с атрибутами по doubleclick запускается команда _EATTEDIT, а для блока без атрибутов - команда _BEDIT:
Я же показал в гифке - все нормально работает
3. Если уж ты не хочешь делать так, как я предложил, то можешь в BeginDoubleClick ставить флажок запрета следующей команды, какая бы она ни была, если это твой блок.
Вот тут нужно уже тестировать. Я дебажил код и в обработчик события DocumentManager_DocumentLockModeChanged команда заходит очень много раз. Боюсь что-то нужное запретить

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

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Значит у тебя настроено не по-умолчанию
Либо мы друг друга не понимаем, либо я не понимаю, что вы хотите мне сказать)) Скринкаст посмотрел и в нем тоже самое, что и в моей гифке. Только у меня командную строку не видно
У меня в автокаде все стандартные настройки. В гифке я показал - если я кликаю по блоку с атрибутом, то запускается команда _EATTEDIT. Но "мой блок" не может иметь атрибутов, поэтому и нет проблем. Если я кликаю по блоку без атрибутов, то мой код срабатывает так, как положен - если "мой блок", то запрещается запуск команды _BEDIT, а если не мой - срабатывает _BEDIT как и положено. Точнее срабатывает то, что настроено у пользователя.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
ok! Убедил. Главное что ты смог посмотреть скринкаст. :) В качестве реакции на даблклик блока может быть еще и _REFEDIT (это не по-умолчанию, но часто используется). Это стоит тоже учесть.
Я дебажил код и в обработчик события DocumentManager_DocumentLockModeChanged
Обрати внимание, что там в большинстве случаев будет команда "#", или команда начинающаяся с "#". В данном случае они тебя не интересуют.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В качестве реакции на даблклик блока может быть еще и _REFEDIT (это не по-умолчанию, но часто используется). Это стоит тоже учесть
Попробовал - разработчики автокада за меня уже все предусмотрели =)) Она не работает с анонимными блоками
Обрати внимание, что там в большинстве случаев будет команда "#", или команда начинающаяся с "#". В данном случае они тебя не интересуют.
Ага, видел. Что это значит? Где-нибудь написано?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ага, видел. Что это значит? Где-нибудь написано?
Нет. Официально об этом нигде нет. Только в примерах попадается.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Неожиданно для меня всплывает эта тема снова. Код прикладывать не буду - он не изменился с моего ответа в этой теме. Но при тестировании возникло неожиданное (лично для меня) поведение - при смене системы координат (команда ПСК) весь мой код перестает работать!
Есть предположения что можно попробовать? У меня что-то идей нет

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Есть предположения что можно попробовать? У меня что-то идей нет
Я не вижу в этой теме кода, который как-либо зависел от системы координат - его просто здесь нет. А пробовать нужно перекодировать точки UCS<->WCS.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я не вижу в этой теме кода, который как-либо зависел от системы координат - его просто здесь нет. А пробовать нужно перекодировать точки UCS<->WCS.
Да, вы правы - дело в координатах. А точнее даже в методе SelectAtPickBox, который я взял тут - http://drive-cad-with-code.blogspot.ru/2013/03/update-custom-double-click-action-using.html. Он не работает с пользовательскими системами координат. Перечитав сейчас запись в блоге, я понял, что могу обойтись в моём случае и без этого метода