Работа с транзакциями в ACAD
Ох, сколько раз я при работе в C# натыкался на то, что я забывал коммитить транзакцию! А сколько раз - на то, что надо было блокировать документ! Все, меня это достало ))
Посмотрев на несколько роликов на AU, спер отличную идею - создать отдельный класс, который будет тупо выполнять лямбда-функцию и гарантированно коммитить транзакцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using System; namespace Repositories { public class DwgRepository { public void DoActionWithinTransaction(Action<Transaction, Database> action) { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) { return; } Database dbDoc = doc.Database; using (DocumentLock docloc = doc.LockDocument()) { using (Transaction trans = doc.TransactionManager.StartTransaction()) { action(trans, dbDoc); trans.Commit(); } } } } } |
И использование становится чертовски простым:
1 2 3 4 5 6 7 8 | DwgRepository dwgRepository = new DwgRepository(); dwgRepository.DoActionWithinTransaction((transaction, database) => { // Любые телодвижения, к примеру: TextStyleTable txtStyleTable = (TextStyleTable) transaction.GetObject(database.TextStyleTableId, OpenMode.ForRead, false, true); // И дальше работаем с таблицей текстовых стилей как вздумается } |
Результат гарантированно будет внесен в базу чертежа. Блин, я начинаю кайфовать от .NET!