// © Андрей Бушман, 2014
// Commands.cs
using System;
using System.Collections.Generic;
#if AUTOCAD
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Ap = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Rt = Autodesk.AutoCAD.Runtime;
#endif
[assembly: Rt.CommandClass(typeof(Bushman.CAD.Sandbox.TransactionGames.Commands))]
namespace Bushman.CAD.Sandbox.TransactionGames {
public sealed class Commands {
/// <summary>
/// За основу взят код Александра Ривилиса:
/// http://adn-cis.org/forum/index.php?topic=940.msg4166#msg4166
/// </summary>
[Rt.CommandMethod("TestOpenClose")]
public void TestOpenClose() {
Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
Db.Database db = doc.Database;
Db.TransactionManager tm = db.TransactionManager;
Ed.Editor ed = doc.Editor;
Ed.PromptKeywordOptions pso = new Ed.PromptKeywordOptions(
"Использовать транзакцию?");
String yes = "Yes";
String no = "No";
pso.Keywords.Add(yes);
pso.Keywords.Add(no);
pso.AppendKeywordsToMessage = true;
pso.Keywords.Default = yes;
Ed.PromptResult pr = ed.GetKeywords(pso);
if (Ed.PromptStatus.OK != pr.Status) {
ed.WriteMessage("Выполнение команды прервано.\n");
}
// С помощью этой переменной можно управлять тем, будет ли работа
// выполняться с использованием транзакции или же с её эмуляцией.
// Т.о. в одном месте изменив значение переменной transaction_use
// можно одним махом изменить способ редактирования объектов сразу
// во многих местах исходного кода (в данном примере показано одно
// такое место):
Boolean transaction_use = pr.StringResult == yes;
Func<Db.Transaction> get_tr = null;
if (transaction_use)
get_tr = tm.StartTransaction;
else
get_tr = tm.StartOpenCloseTransaction;
// Т.к. OpenCloseTransaction наследуется от Transaction, то можно
// записать так:
using (Db.Transaction tr = get_tr()) {
Db.Circle cr = new Db.Circle();
cr.SetDatabaseDefaults(db);
cr.Radius = 10;
Db.BlockTableRecord mspace = tr.GetObject(db.CurrentSpaceId,
Db.OpenMode.ForWrite) as Db.BlockTableRecord;
mspace.AppendEntity(cr);
tr.AddNewlyCreatedDBObject(cr, true);
// Если это строка закомментарена, то Круг не появляется:
tr.Commit();
}
}
}
}