Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Lemieux от 24-10-2021, 21:59:19

Название: Вложенные транзакции
Отправлено: Lemieux от 24-10-2021, 21:59:19
Всех приветствую. Как я понимаю, если открыть транзакцию, вызывать метод, в котором открывается и коммитится ещё одна транзакция и создаётся entity(линия/полилиния), то entity не появится на чертеже (например нельзя выделить её SelectCrossingPolygon()) пока верхняя транзакция не закоммитится?
Название: Re: Вложенные транзакции
Отправлено: Александр Ривилис от 24-10-2021, 22:31:46
то entity не появится на чертеже
Появляется:

Код - C# [Выбрать]
  1. [CommandMethod("NestTrans")]
  2. public void MyCommand()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Database db = doc.Database;
  7.   Editor ed = doc.Editor;
  8.   using (Transaction tr = doc.TransactionManager.StartTransaction())
  9.   {
  10.     using (Transaction trNest = doc.TransactionManager.StartTransaction())
  11.     {
  12.       BlockTableRecord btr =
  13.         trNest.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  14.       Circle cir = new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0);
  15.       btr.AppendEntity(cir);
  16.       trNest.AddNewlyCreatedDBObject(cir, true);
  17.       trNest.Commit();
  18.       doc.TransactionManager.QueueForGraphicsFlush();
  19.       doc.TransactionManager.FlushGraphics();
  20.       ed.GetString("\nНажмите ENTER...");
  21.     }
  22.     tr.Commit();
  23.   }
  24. }
Название: Re: Вложенные транзакции
Отправлено: Lemieux от 24-10-2021, 22:35:58
то entity не появится на чертеже
Появляется:

Код - C# [Выбрать]
  1. [CommandMethod("NestTrans")]
  2. public void MyCommand()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Database db = doc.Database;
  7.   Editor ed = doc.Editor;
  8.   using (Transaction tr = doc.TransactionManager.StartTransaction())
  9.   {
  10.     using (Transaction trNest = doc.TransactionManager.StartTransaction())
  11.     {
  12.       BlockTableRecord btr =
  13.         trNest.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  14.       Circle cir = new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0);
  15.       btr.AppendEntity(cir);
  16.       trNest.AddNewlyCreatedDBObject(cir, true);
  17.       trNest.Commit();
  18.       doc.TransactionManager.QueueForGraphicsFlush();
  19.       doc.TransactionManager.FlushGraphics();
  20.       ed.GetString("\nНажмите ENTER...");
  21.     }
  22.     tr.Commit();
  23.   }
  24. }
Круто! Спасибо!
Название: Re: Вложенные транзакции
Отправлено: avc от 24-10-2021, 22:49:48
А как насчет отката транзакции? Есть красный объект А. Транзакция Б перекрашивает А в зеленый. Потом вложенная транзакция С перекрашивает А в синий и C.Commit().  Потом Б.Abort(). Цвет объекта А? синий или красный?
Название: Re: Вложенные транзакции
Отправлено: Александр Ривилис от 24-10-2021, 22:52:25
синий или красный?
Должен быть красный. Не сложно проверить. ;)
Название: Re: Вложенные транзакции
Отправлено: Александр Ривилис от 24-10-2021, 23:01:28
Код - C# [Выбрать]
  1. [CommandMethod("NestTrans1")]
  2. public void MyCommand1()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Database db = doc.Database;
  7.   Editor ed = doc.Editor;
  8.   PromptEntityResult rs = ed.GetEntity("\nВыберите красный круг");
  9.   if (rs.Status != PromptStatus.OK) return;
  10.   using (Transaction tr = doc.TransactionManager.StartTransaction())
  11.   {
  12.     Entity en = tr.GetObject(rs.ObjectId, OpenMode.ForWrite) as Entity;
  13.     en.ColorIndex = 3;
  14.     using (Transaction trNest = doc.TransactionManager.StartTransaction())
  15.     {
  16.       Entity enNest = trNest.GetObject(rs.ObjectId, OpenMode.ForWrite) as Entity;
  17.       enNest.ColorIndex = 5;
  18.       trNest.Commit();
  19.       doc.TransactionManager.QueueForGraphicsFlush();
  20.       doc.TransactionManager.FlushGraphics();
  21.       ed.GetString("\nНажмите ENTER...");
  22.     }
  23.     tr.Abort();
  24.   }
  25. }