Работа с транзакциями в 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! :)

Размещено в .NET, AutoCAD, Новости · Метки: , , , ,



Поделитесь своим мнением


Я не робот.