Событие запуска команды "отмена" (UNDO).

Автор Тема: Событие запуска команды "отмена" (UNDO).  (Прочитано 8038 раз)

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Уважаемые коллеги, прошу совета!
Будет ли корректным такой способ определения запущена ли команда отмены? :
Код - C# [Выбрать]
  1. Application.GetSystemVariable("CMDNAMES").ToString().Equals("U", StringComparison.InvariantCultureIgnoreCase)
Возможно, есть какой-то более надежный способ?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Возможно, есть какой-то более надежный способ?
Почему не хочешь просто в событии Document.CommandWillStart проверить имя запущеной команды?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Вообще, мне нужно в событии Database.ObjectModified исключить обработку объектов, изменяемых в команде Undo. Можно, конечно, добавить обработку события запуска-завершения команды и отключать на это время обработчик Database.ObjectModified. Но мне кажется, что это принципиально не отличается от моего способа. Или чем-то такой подход лучше?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Вообще, мне нужно в событии Database.ObjectModified исключить обработку объектов, изменяемых в команде Undo.
Ну так это уже совсем др. вопрос, не относящийся к первому.

Отмечено как Решение Дмитрий Загорулькин 07-12-2015, 17:02:42

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Возможно, есть какой-то более надежный способ?
Тебя интересует запуск команды отмены или факт того, что выполняется отмена? Это разные вещи. Во-первых, не только команда _U, но и команда _UNDO выполняет отмену (_UNDO без параметров, _UNDO <N>, _UNDO _Back). Во-вторых, не каждый запуск _UNDO приводит к отмене (_UNDO _Control, _UNDO _Begin, _UNDO _End). Как обычно не все возможности реактора в ObjectARX перевели в события AutoCAD .NET API, так что специальных средств понять с какими опциями запущена команда _UNDO в AutoCAD .NET API нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вообще, мне нужно в событии Database.ObjectModified исключить обработку объектов, изменяемых в команде Undo.
DBObject.IsUndoing ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как-то так:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5.  
  6. [assembly: CommandClass(typeof(CheckUndo.MyCommands))]
  7.  
  8. namespace CheckUndo
  9. {
  10.   public class MyCommands
  11.   {
  12.     [CommandMethod("TestUndo")]
  13.     public void test()
  14.     {
  15.       Database db = HostApplicationServices.WorkingDatabase;
  16.       db.ObjectModified += db_ObjectModified;
  17.     }
  18.  
  19.     static void db_ObjectModified(object sender, ObjectEventArgs e)
  20.     {
  21.       if (e.DBObject.IsUndoing) {
  22.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  23.         ed.WriteMessage("\nIsUndoing {0}", e.DBObject.Id);
  24.       }
  25.     }
  26.   }
  27. }

Интересно, что при команде UNDO/U для одного и того же объекта db_ObjectModified вызывается многократно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Интересно, что при команде UNDO/U для одного и того же объекта db_ObjectModified вызывается многократно.
Да, причем сперва у этих объектов e.DBObject.IsUndoing = false.
Я почему озадачился этим вопросом - у меня вылезла проблема в операции отмены. Невозможно было открыть нужные мне объекты (трубы и колодцы Civil) даже для чтения, чтобы получить нужные свойства - приложение вылетало с ошибкой, которую даже try-catch не обрабатывал. Благодаря Вашему ответу из сообщения #4 я понял, что вопрос гораздо сложнее, чем я себе представлял и решил пойти другим путем. В моем случае, мне не принципиально получение свойств непосредственно в методе db_ObjectModified. Поэтому, я сделал в нем просто сохранение ObjectId нужных мне изменившихся объектов в список-буфер с последующей обработкой этого списка в событии Editor.EnteringQuiescentState. Объекты в этот момент уже "свободны" от операции отмены и проблем с получением их свойств нет.