| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > C#.Net 4.0. Транзакция внутри объектного обработчика событий.

C#.Net 4.0. Транзакция внутри объектного обработчика событий.

Ответ
Поиск в этой теме
Непрочитано 29.11.2012, 17:53 #1
C#.Net 4.0. Транзакция внутри объектного обработчика событий.
Do$
 
AutoCAD/Civil3D LISP/C#
 
Санкт-Петербург
Регистрация: 15.08.2008
Сообщений: 1,702

Добавил транзакцию в обработчик, автокад стал уходить в полный завис.
Выходит, что транзакцию нельзя запускать в обработчике?

Код:
[Выделить все]
using System;

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;

using Autodesk.Civil.ApplicationServices;


namespace DwgRu
{
    public class EventsTest
    {
        static Document adoc;
        static Database db;      
        static Editor ed;
        //static Transaction tr;

        static string Path = "";

        [CommandMethod("EventsOn1")]
        public void EventOn()
        {
            adoc = Application.DocumentManager.MdiActiveDocument;
            db = adoc.Database;            
            ed = adoc.Editor;

            ed.WriteMessage("\nВключено отслеживание событий:");

            ed.WriteMessage("\n - Изменение базы данных чертежа:");

            ed.WriteMessage("\n      - Модификация объекта");
            db.ObjectModified += new ObjectEventHandler(db_ObjectModified);

            ed.WriteMessage("\n      - Добавление объекта");
            db.ObjectAppended += new ObjectEventHandler(db_ObjectAppended);

            ed.WriteMessage("\n      - Удаление объекта");
            db.ObjectErased += new ObjectErasedEventHandler(db_ObjectErased);

            ed.WriteMessage("\n      - Исключение объекта");
            db.ObjectUnappended += new ObjectEventHandler(db_ObjectUnappended);

            ed.WriteMessage("\n      - Возвращение объекта");
            db.ObjectReappended += new ObjectEventHandler(db_ObjectReappended);

            char[] ChPoint = { '.' };
            string DWGName = Application.GetSystemVariable("DWGNAME").ToString().Split(ChPoint)[0];
            DateTime Dt = DateTime.Now;            

            Path = Application.GetSystemVariable("DWGPREFIX").ToString() + DWGName
                + "_" + Dt.Year + Dt.Month + Dt.Day + "_" + Dt.Hour + Dt.Minute + Dt.Second + ".txt";

            ed.WriteMessage("\nСобытия регистрируются в текстовом файле: " + Path);
        }


        [CommandMethod("EventsOff1")]
        public void EventOff()
        {
            ed.WriteMessage("\nОтключено отслеживание событий:");

            ed.WriteMessage("\n - Изменение базы данных чертежа:");

            ed.WriteMessage("\n      - Модификация объекта");
            db.ObjectModified -= new ObjectEventHandler(db_ObjectModified);

            ed.WriteMessage("\n      - Добавление объекта");
            db.ObjectAppended -= new ObjectEventHandler(db_ObjectAppended);

            ed.WriteMessage("\n      - Удаление объекта");
            db.ObjectErased -= new ObjectErasedEventHandler(db_ObjectErased);

            ed.WriteMessage("\n      - Исключение объекта");
            db.ObjectUnappended -= new ObjectEventHandler(db_ObjectUnappended);

            ed.WriteMessage("\n      - Возвращение объекта");
            db.ObjectReappended -= new ObjectEventHandler(db_ObjectReappended);
        }

        static void db_ObjectUnappended(object sender, ObjectEventArgs e)
        { ObjectMessageWrite(e.DBObject, "unappended"); }

        static void db_ObjectReappended(object sender, ObjectEventArgs e)
        { ObjectMessageWrite(e.DBObject, "reappended"); }

        static void db_ObjectErased(object sender, ObjectErasedEventArgs e)
        { ObjectMessageWrite(e.DBObject, "erased"); }

        static void db_ObjectAppended(object sender, ObjectEventArgs e)
        { ObjectMessageWrite(e.DBObject, "appended"); }

        static void db_ObjectModified(object sender, ObjectEventArgs e)
        { ObjectMessageWrite(e.DBObject, "modified"); }

        static void Write2Txt(string txt)
        {
            using (System.IO.StreamWriter file = new System.IO.StreamWriter(Path, true))
            { file.WriteLine(txt); }
        }

        static void ObjectMessageWrite(Autodesk.AutoCAD.DatabaseServices.DBObject DBObj, string action)
        {
            string MsgStrAdd = "";
            //using (Transaction tr = adoc.TransactionManager.StartTransaction())
            //{
                switch (DBObj.GetRXClass().DxfName)
                {
                    case "LAYER":
                        LayerTableRecord layer;
                        layer = DBObj as LayerTableRecord;
                        MsgStrAdd = "; LayerName = " + layer.Name;
                        break;
                    case "BLOCK_RECORD":
                        BlockTableRecord Blk = DBObj as BlockTableRecord;
                        MsgStrAdd = "; BlockName = " + Blk.Name;
                        break;
                    case "LAYOUT":
                        Layout Layt = DBObj as Layout;
                        MsgStrAdd = "; LayoutName = " + Layt.LayoutName;
                        break;                                 
                    default:
                        break;
                }
            //    tr.Commit();
            //}

            Write2Txt("Object " + action + ": DxfName - " + DBObj.GetRXClass().DxfName + "; Handle - " + DBObj.Handle + MsgStrAdd);
        }
    }
}
Просмотров: 1975
 
Непрочитано 29.11.2012, 18:55
1 | #2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Выходит, что транзакцию нельзя запускать в обработчике?
В объектном? Ну ты как бы рекурсию запускаешь.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > C#.Net 4.0. Транзакция внутри объектного обработчика событий.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск