Отмена действия CTRL Z

Автор Тема: Отмена действия CTRL Z  (Прочитано 6941 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Отмена действия CTRL Z
« : 05-02-2016, 16:32:48 »
Добрый день!
Подскажите можно ли на событие CTRL Z посадить отмену последнего действия. Есть ли какие родные API?
Для пояснения:
Например рисую полилинию задаю опцию PromptPointOptions.SetMessageAndKeywords(vbLf & "Выберите следующую точку или [Отменить]: ", "Отменить") . Далее обрабатываю PromptStatus.Keyword и все хорошо работает. А вот как сделать тоже самое на CTRL Z. Если родную командой полилинию чертить CTRL Z работает отлично.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Отмена действия CTRL Z
« Ответ #1 : 05-02-2016, 16:48:42 »
CTRL+Z посылает в командную строку "_U". Вот его и обрабатывай как ключевое слово.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Отмена действия CTRL Z
« Ответ #2 : 05-02-2016, 17:31:09 »
Я переделал немного код отсюда для того, чтобы можно было обрабатывать отмену (CTRL+Z):

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using AcEd = Autodesk.AutoCAD.EditorInput;
  8. using AcRx = Autodesk.AutoCAD.Runtime;
  9. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  10. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  11. using AcGe = Autodesk.AutoCAD.Geometry;
  12.  
  13. #pragma warning disable 0618
  14.  
  15. [assembly: CommandClass(typeof(MakeContour.MyCommands))]
  16.  
  17. namespace MakeContour
  18. {
  19.  
  20.   public class MyCommands
  21.   {
  22.     [CommandMethod("MakeContour")]
  23.     public void MyCommand()
  24.     {
  25.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  26.       AcDb.Database db = doc.Database;
  27.       AcEd.Editor ed = doc.Editor;
  28.       AcEd.PromptPointOptions pr =
  29.         new AcEd.PromptPointOptions("\nУкажите вершину контура: ");
  30.       AcDb.ObjectId idPoly;
  31.       AcGe.Point3d lastPt = AcGe.Point3d.Origin;
  32.       using (AcDb.Polyline poly = new AcDb.Polyline())
  33.       {
  34.         using (AcDb.BlockTableRecord space =
  35.           db.CurrentSpaceId.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockTableRecord)
  36.         {
  37.           idPoly = space.AppendEntity(poly);
  38.         }
  39.       }
  40.       int nVert = 0;
  41.       while (true)
  42.       {
  43.         pr.BasePoint = lastPt;
  44.         pr.UseBasePoint = true;
  45.         pr.UseDashedLine = true;
  46.         if (nVert >= 3)
  47.         {
  48.           pr.AllowNone = true;
  49.           pr.SetMessageAndKeywords(
  50.             "\nУкажите вершину контура [Отменить] (ENTER - завершение): ", "U");
  51.         } else if (nVert >= 1)
  52.         {
  53.           pr.SetMessageAndKeywords(
  54.             "\nУкажите вершину контура [Отменить]: ", "U");
  55.         }
  56.         else
  57.         {
  58.           pr.UseBasePoint = false;
  59.           pr.Message = "\nУкажите вершину контура: ";
  60.           pr.Keywords.Clear();
  61.         }
  62.         AcEd.PromptPointResult res = ed.GetPoint(pr);
  63.         if (res.Status == AcEd.PromptStatus.Keyword)
  64.         {
  65.           if (res.StringResult == "U" && nVert > 0)
  66.           {
  67.             using (AcDb.Polyline poly = idPoly.Open(AcDb.OpenMode.ForWrite) as AcDb.Polyline)
  68.             {
  69.               try
  70.               {
  71.                 if (nVert == 1)
  72.                 {
  73.                   poly.Reset(true, 0);
  74.                 }
  75.                 else
  76.                 {
  77.                   poly.RemoveVertexAt(poly.NumberOfVertices - 1);
  78.                   lastPt = poly.EndPoint;
  79.                 }
  80.               } catch { }
  81.               --nVert;
  82.             }
  83.           }
  84.         }
  85.         else if (res.Status == AcEd.PromptStatus.Cancel)
  86.         {
  87.           using (AcDb.Polyline poly = idPoly.Open(AcDb.OpenMode.ForWrite) as AcDb.Polyline)
  88.           {
  89.             poly.Erase();
  90.             break;
  91.           }
  92.         }
  93.         else if (res.Status == AcEd.PromptStatus.None)
  94.         {
  95.           break;
  96.         }
  97.         else
  98.         {
  99.           lastPt = res.Value;
  100.           using (AcDb.Polyline poly = idPoly.Open(AcDb.OpenMode.ForWrite) as AcDb.Polyline)
  101.           {
  102.             poly.AddVertexAt(poly.NumberOfVertices,
  103.               new AcGe.Point2d(res.Value.X, res.Value.Y), 0, 0, 0);
  104.           }
  105.           nVert++;
  106.         }
  107.       }
  108.       // Полилинию, у которой меньше двух вершин удаляем
  109.       using (AcDb.Polyline poly = idPoly.Open(AcDb.OpenMode.ForWrite) as AcDb.Polyline)
  110.       {
  111.         try {
  112.           if (poly.NumberOfVertices < 2) poly.Erase();
  113.         }
  114.         catch { }
  115.       }
  116.     }
  117.   }
  118. }

« Последнее редактирование: 05-02-2016, 18:28:16 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Отмена действия CTRL Z
« Ответ #3 : 05-02-2016, 19:49:20 »
"До кучи" вспомнил - при штатном вызове отмены любым способом не учитываются возможные изменения ExtensionDictionary примитивов. Особенность, не критичная, но если про нее не знать - не приятная - рецепт лечения простой - если необходимо изменить ExtensionDictionary, то их сначала следует удалить (.Remove...) и записать заново.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Отмена действия CTRL Z
« Ответ #4 : 05-02-2016, 19:55:26 »
Дима_
Я так понимаю, что ты об этом: UNDO удаляет обновленные записи словаря
Не совсем понятно правда какое это имеет отношение к данной теме, так вопрос состоит не в поведении штатной команды _UNDO, а в эмуляции _UNDO для своей команды.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Отмена действия CTRL Z
« Ответ #5 : 05-02-2016, 20:38:10 »
Да именно про это. Показалось что может иметь отношение и будет не лишне дописать в статье про отмену. Указанную Вами статью я видимо пропустил (а может мой "прецендент" оказался раньше - сейчас не вспомнить), в общем сам "попадался" на этом поведении - поэтому и запомнил. Решил - хоть автор пишет про другое - будет не лишне, т.к. вроде к названию темы, а особенность из "заковыристых".

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Отмена действия CTRL Z
« Ответ #6 : 05-02-2016, 21:58:29 »
Александр Ривилис,
Александр большое спасибо!
Хотел уточнить насколько необходим  этот кусочек "res.StringResult == "U""
У меня отрабатывает  CTRL+Z без этой части, т.е. хватает   if (res.Status == AcEd.PromptStatus.Keyword). Отрабатывает и на "отменить" и на "о" и на CTRL+Z.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Отмена действия CTRL Z
« Ответ #7 : 05-02-2016, 22:14:52 »
Хотел уточнить насколько необходим  этот кусочек "res.StringResult == "U""
Это на случай если ты еще придумаешь дополнительны ключевые слова (например, Дуга <-> Arc для переключения в режим ввода дуговых сегментов).
Отрабатывать и на "отменить" и на "о" и на CTRL+Z.
Во всех этих трёх случаях ты получаешь res.StringResult равный "U", т.к. это глобальное ключевое слово, соответствующее "о" в локализованном (русском) варианте.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение