05/06/2015
Как заставить две команды работать как одну
Когда одна команда запускает другую команду из приложения вы можете захотеть, чтобы AutoCAD воспринимал их как единую команду когда пользователь использует команду Отмени (Undo) или хочет повторить последнюю команду.Например, команда "Test1" запускает другую команду "Test2". Вы можете пожелать чтобы оба действия отменились AutoCAD’ом вместе при нажатии Ctrl+Z. Аналогично, когда вы повторяете команду нажатием клавиши Enter, вы хотите чтобы запускалась команда "Test1", а не "Test2".
Чтобы это сделать нужно «скрыть» команду "Test2" с помощью флагов CommandFlags.NoHistory и CommandFlags.NoUndoMarker.
Ниже пример кода. Чтобы почувствовать эффект от этих флагов, вы можете их убрать и сравнить поведение AutoCAD с ними и без них.
Код - C#: [Выделить]
- [CommandMethod("Test1")]
- static public void Test1Method()
- {
- Document activeDoc = Application.DocumentManager.MdiActiveDocument;
- Database db = activeDoc.Database;
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- ed.WriteMessage("\nВнутри Test1...");
- // Создаём отрезок
- double dist = 10.0;
- Point3d mid = Point3d.Origin;
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- BlockTable bt = tr.GetObject(
- db.BlockTableId,
- OpenMode.ForRead
- ) as BlockTable;
- BlockTableRecord ms = tr.GetObject
- (
- db.CurrentSpaceId,
- OpenMode.ForWrite
- ) as BlockTableRecord;
- Point3d sp = mid.TransformBy
- (
- Matrix3d.Displacement
- (
- new Vector3d(-0.70710678,
- -0.70710678,
- 0.0
- ) * dist
- )
- );
- Point3d ep = mid.TransformBy
- (
- Matrix3d.Displacement
- (
- new Vector3d(
- 0.70710678,
- 0.70710678,
- 0.0
- ) * dist
- )
- );
- Line line = new Line(sp, ep);
- ms.AppendEntity(line);
- tr.AddNewlyCreatedDBObject(line, true);
- tr.Commit();
- }
- // Запускаем "Test2"
- activeDoc.SendStringToExecute("Test2 ", false, false, false);
- }
- // Раскоментарьте чтобы увидеть разницу.
- //[CommandMethod("Test2")]
- [CommandMethod("Test2", CommandFlags.NoHistory | CommandFlags.NoUndoMarker)]
- static public void Test2Method()
- {
- Document activeDoc
- = Application.DocumentManager.MdiActiveDocument;
- Database db = activeDoc.Database;
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- ed.WriteMessage("\nВнутри Test2...");
- // Создаём окружность
- double radius = 10.0;
- Point3d center = Point3d.Origin;
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- BlockTable bt = tr.GetObject(
- db.BlockTableId,
- OpenMode.ForRead
- ) as BlockTable;
- BlockTableRecord ms = tr.GetObject
- (
- db.CurrentSpaceId,
- OpenMode.ForWrite
- ) as BlockTableRecord;
- Circle circle = new Circle(center, Vector3d.ZAxis, radius);
- ms.AppendEntity(circle);
- tr.AddNewlyCreatedDBObject(circle, true);
- tr.Commit();
- }
- }
Источник: 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