ADN Open CIS
Сообщество программистов Autodesk в СНГ

05/06/2015

Как заставить две команды работать как одну

Когда одна команда запускает другую команду из приложения вы можете захотеть, чтобы AutoCAD воспринимал их как единую команду когда пользователь использует команду Отмени (Undo) или хочет повторить последнюю команду.

Например, команда "Test1" запускает другую команду "Test2". Вы можете пожелать чтобы оба действия отменились AutoCAD’ом вместе при нажатии Ctrl+Z. Аналогично, когда вы повторяете команду нажатием клавиши Enter, вы хотите чтобы запускалась команда "Test1", а не "Test2".

Чтобы это сделать нужно «скрыть» команду "Test2" с помощью флагов CommandFlags.NoHistory и CommandFlags.NoUndoMarker.

Ниже пример кода. Чтобы почувствовать эффект от этих флагов, вы можете их убрать и сравнить поведение AutoCAD с ними и без них.

Код - C#: [Выделить]
  1. [CommandMethod("Test1")]
  2. static public void Test1Method()
  3. {
  4.     Document activeDoc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = activeDoc.Database;
  6.  
  7.     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  8.     ed.WriteMessage("\nВнутри Test1...");
  9.  
  10.     // Создаём отрезок
  11.     double dist = 10.0;
  12.     Point3d mid = Point3d.Origin;
  13.  
  14.     using (Transaction tr = db.TransactionManager.StartTransaction())
  15.     {
  16.         BlockTable bt = tr.GetObject(
  17.                                         db.BlockTableId,
  18.                                         OpenMode.ForRead
  19.                                     ) as BlockTable;
  20.         BlockTableRecord ms = tr.GetObject
  21.                                         (
  22.                                             db.CurrentSpaceId,
  23.                                             OpenMode.ForWrite
  24.                                         ) as BlockTableRecord;
  25.         Point3d sp = mid.TransformBy
  26.                         (
  27.                             Matrix3d.Displacement
  28.                             (
  29.                                 new Vector3d(-0.70710678,
  30.                                              -0.70710678,
  31.                                              0.0
  32.                                             ) * dist
  33.                             )
  34.                         );
  35.         Point3d ep = mid.TransformBy
  36.                         (
  37.                             Matrix3d.Displacement
  38.                             (
  39.                                 new Vector3d(
  40.                                              0.70710678,
  41.                                              0.70710678,
  42.                                              0.0
  43.                                             ) * dist
  44.                             )
  45.                         );
  46.         Line line = new Line(sp, ep);
  47.  
  48.         ms.AppendEntity(line);
  49.         tr.AddNewlyCreatedDBObject(line, true);
  50.         tr.Commit();
  51.     }
  52.  
  53.     // Запускаем "Test2"
  54.     activeDoc.SendStringToExecute("Test2 ", false, false, false);
  55. }
  56.  
  57. //  Раскоментарьте чтобы увидеть разницу.
  58. //[CommandMethod("Test2")]
  59.  
  60. [CommandMethod("Test2", CommandFlags.NoHistory | CommandFlags.NoUndoMarker)]
  61. static public void Test2Method()
  62. {
  63.     Document activeDoc
  64.                 = Application.DocumentManager.MdiActiveDocument;
  65.     Database db = activeDoc.Database;
  66.  
  67.     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  68.     ed.WriteMessage("\nВнутри Test2...");
  69.  
  70.     // Создаём окружность
  71.     double radius = 10.0;
  72.     Point3d center = Point3d.Origin;
  73.  
  74.     using (Transaction tr = db.TransactionManager.StartTransaction())
  75.     {
  76.         BlockTable bt = tr.GetObject(
  77.                                        db.BlockTableId,
  78.                                        OpenMode.ForRead
  79.                                    ) as BlockTable;
  80.         BlockTableRecord ms = tr.GetObject
  81.                                         (
  82.                                             db.CurrentSpaceId,
  83.                                             OpenMode.ForWrite
  84.                                         ) as BlockTableRecord;
  85.  
  86.         Circle circle = new Circle(center, Vector3d.ZAxis, radius);
  87.  
  88.         ms.AppendEntity(circle);
  89.         tr.AddNewlyCreatedDBObject(circle, true);
  90.         tr.Commit();
  91.     }
  92. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/08/making-two-commands-act-as-one.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=2769

Опубликовано 05.06.2015