Как закрыть текстовый редактор?

Автор Тема: Как закрыть текстовый редактор?  (Прочитано 5696 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Столкнулся с такой проблемой: если у меня не модальное окно и есть кнопка примерно с таким набором действий:
Код - C# [Выбрать]
  1. Hide();
  2. var doc = AcApp.DocumentManager.MdiActiveDocument;
  3. var db = doc.Database;
  4. var ed = doc.Editor;
  5. try
  6. {
  7.     using (doc.LockDocument())
  8.     {
  9.         var tr = db.TransactionManager.StartTransaction();
  10.         using (tr)
  11.         {
  12.             var peo = new PromptEntityOptions("\nSelect MText");
  13.             peo.SetRejectMessage("\nWrong");
  14.             peo.AddAllowedClass(typeof(MText), true);
  15.             peo.AllowNone = true;
  16.             var per = ed.GetEntity(peo);
  17. //.....
  18. Show();
то при нажатии на эту кнопку в момент, когда в автокаде идет редактирование многострочного текста, происходит эффект зависания. Окно скрывается, мы переходим в автокад и НЕ можем закрыть редактор.

Чет я и погуглили и так по АПИ полазил - ничего не нахожу подходящего. Нуждаюсь в совете

Отмечено как Решение Александр Пекшев aka Modis 30-11-2018, 00:25:07

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Как закрыть текстовый редактор?
« Ответ #1 : 29-11-2018, 23:09:09 »
У меня прям проклятие - пишу вопрос и через пару минут нахожу ответ!
Итак, перед обращением к Editor нужно проверить, что он готов принимать команды. Для этого есть свойство Editor.IsQuiescent. Если редактор текста открыт, то это свойство будет равняться false.
Описание свойства из справки:
Цитировать
Use this function to check if the host is busy processing other commands. If busy, the function returns false message, else returns true.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как закрыть текстовый редактор?
« Ответ #2 : 29-11-2018, 23:09:39 »
Может проще проверить, что команда MTEDIT запущена и не выполнять свой код???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Как закрыть текстовый редактор?
« Ответ #3 : 29-11-2018, 23:12:05 »
Может проще проверить, что команда MTEDIT запущена и не выполнять свой код???
Думаю, правильнее делать как я предложил - это проверит, если вдруг выполняются другие команды.
А вот как теперь это учесть во всех функциях с немодальными окнами?.... ((

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как закрыть текстовый редактор?
« Ответ #4 : 29-11-2018, 23:31:00 »
А вот как теперь это учесть во всех функциях с немодальными окнами?.... ((
Как-как. Ручками! :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Как закрыть текстовый редактор?
« Ответ #5 : 30-11-2018, 14:07:33 »
если у меня не модальное окно и есть кнопка примерно с таким набором действий:
Я, относительно недавно, пришёл к выводу, что так делать не совсем корректно. Отсюда и возникают потом различные проблемы, типа этой. В чём именно некорректность - в AutoCAD практически любое изменение объекта чертежа происходит в рамках запущенной команды. В базовом AutoCAD я не встречал нарушений этого принципа, в Civil - ловил. Из-за этого, кстати, в Civil были некоторые проблемы.
Вот, например, есть палитра слоёв. Нажимаем кнопку "Создать слой" - запускается команда "-LAYER":
[Doc Event] : Command will Start        : -LAYER
...
[Doc Event] : Command Ended             : -LAYER
Что даёт такой подход:
- Не нужно никаких телодвижений для выполнения корректной отмены действий. Выполняется стандартная отмена последней команды. Если выполнять изменения вне команды, с отменой есть сложности.
- Команды всегда выполняются последовательно. Нет такого, что одновременно будут выполняться две команды и мешать друг другу. Я сейчас не имею в виду прозрачные команды, только основные.
- Нет проблем с обработкой событий. Всегда будет такой порядок: запущена команда - изменены объекты - завершена команда. Даже если потом другой код будет работать параллельно с нашим, он всегда корректно обработает ситуацию изменения объекта. Не возникнет непонятных ситуаций, когда не выполняется никакая команда, а объекты чертежа почему-то изменяются. Отловить такие изменения можно, но уже гораздо сложнее.
В своём "палитроплагине" мне удалось реализовать такой механизм, чтобы любое изменение объектов происходило через запуск команды. Принцип такой - при изменении пользователем каких-то данных в палитре происходит запоминание действий, которые нужно выполнить и отправка запроса на асинхронное выполнение команды, которая эти изменения будет выполнять. Как только AutoCAD будет готов выполнить эту команду, она запускается. Команда всегда одна и та же, но набор действий, который она выполняет, зависит от действий пользователя в палитре.
Как вам такая идея?

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Re: Как закрыть текстовый редактор?
« Ответ #6 : 30-11-2018, 20:00:58 »
В своём "палитроплагине" мне удалось реализовать такой механизм, чтобы любое изменение объектов происходило через запуск команды. Принцип такой - при изменении пользователем каких-то данных в палитре происходит запоминание действий, которые нужно выполнить и отправка запроса на асинхронное выполнение команды, которая эти изменения будет выполнять. Как только AutoCAD будет готов выполнить эту команду, она запускается. Команда всегда одна и та же, но набор действий, который она выполняет, зависит от действий пользователя в палитре.
Как вам такая идея?
Предстоит делать палитроплагин. Это интересная идея.
Сейчас все меняется по событиям с палитры, без запуска команд.
Основной минус, в отмене действий! Параллельность маловероятна.
Но, штатная палитра свойств, не запускает команды!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как закрыть текстовый редактор?
« Ответ #7 : 30-11-2018, 20:04:13 »
Но, штатная палитра свойств, не запускает команды!
Ну тут скорее аналог не с Property Palette, а с Tools Palette.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Как закрыть текстовый редактор?
« Ответ #8 : 30-11-2018, 20:14:36 »
Но, штатная палитра свойств, не запускает команды!
Да, со свойствами это происходит как-то по-другому. Если развернуть список отмены, то там есть пункт "Изменение свойства", то есть, как будто какая-то команда запускалась. Но никакое событие начала - завершения команды не отрабатывает. Но в командной строке после каждого изменения свойств появляется новая строка:
Команда:
Команда:
Команда:
Если разобраться что это за механизм и как он работает, то можно было бы использовать его вместо того, который я описал.
ARXDBG показывает это так:
Команда:
[EVENT REACTOR] : [Modeless Operation Will Start, OPM_CHGPROP]
[EVENT REACTOR] : [Modeless Operation Ended, OPM_CHGPROP]
Вот что это за Modeless Operation?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как закрыть текстовый редактор?
« Ответ #9 : 30-11-2018, 20:27:24 »
Вот что это за Modeless Operation?
Это не команда. Это просто возможность уведомить какое-то приложение (или сам AutoCAD), что какая-то операция началась и закончилась.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как закрыть текстовый редактор?
« Ответ #10 : 30-11-2018, 20:29:57 »
Если разобраться что это за механизм и как он работает, то можно было бы использовать его вместо того, который я описал.
Нет. Во-первых, не будет работать отмена. Во-вторых, нужно будет блокировать документы. В-третьих, это есть в ObjectARX, но нет в AutoCAD .NET API - да и не надо. Этим я пользовался для того, чтобы отреагировать на изменение свойств в палитре свойств:
http://adn-cis.org/kak-opredelit-chto-svojstva-primitiva-izmenenyi-pri-pomoshhi-paneli-svojstv.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение