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

ADN Club => AutoCAD .NET API => Тема начата: Вильдар от 18-10-2016, 19:42:25

Название: Обработка события добавления объекта в базу чертежа ObjectAppended
Отправлено: Вильдар от 18-10-2016, 19:42:25
Добрый вечер всем!
Нужно обработать событие добавление объекта в базу. С использованием транзакции! Но, ее похоже нельзя использовать в этот момент.
В чем причина? И как лучше обойти эту ситуацию?

Тестовый пример.
В команде подписываюсь на событие добавления объекта в базу, потом добавляю в модель точку. Срабатывает событие, и в некотором методе нужно сделать кое-что с использованием транзакции.
Извините, вам запрещён просмотр содержимого спойлеров.

Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Обработка события добавления объекта в базу чертежа ObjectAppended
Отправлено: Александр Ривилис от 18-10-2016, 19:54:13
Попробуй эмуляцию транзакции.
Название: Re: Обработка события добавления объекта в базу чертежа ObjectAppended
Отправлено: Вильдар от 18-10-2016, 20:31:34
Код - C# [Выбрать]
  1.             using (var t = db.TransactionManager.StartOpenCloseTransaction())
  2.             {
  3.                 var ent = entId.GetObject(OpenMode.ForRead);
  4.                 t.Commit();
  5.             }
Подскажите, как исправить открытие объекта в случает StartOpenCloseTransaction. Никогда ей не пользовался.
Название: Re: Обработка события добавления объекта в базу чертежа ObjectAppended
Отправлено: Вильдар от 18-10-2016, 20:36:56
Тестовая эмуляция транзакции.
Код - C# [Выбрать]
  1.         private void Db_ObjectAppended (object sender, ObjectEventArgs e)
  2.         {
  3.             using (var t = db.TransactionManager.StartOpenCloseTransaction())
  4.             {
  5.                 Do();
  6.                 t.Commit();
  7.             }
  8.         }
  9.  
  10.         /// <summary>
  11.         /// Некоторый метод обработки. Которому нужно использовать транзакцию.
  12.         /// </summary>
  13.         private void Do ()
  14.         {
  15.             var t = db.TransactionManager.TopTransaction;
  16.             // "eInProcessOfCommitting"
  17.             var ent = t.GetObject(entId,OpenMode.ForRead);
  18.         }
Ошибка eInProcessOfCommitting на 17 строке.
Название: Re: Обработка события добавления объекта в базу чертежа ObjectAppended
Отправлено: Александр Ривилис от 18-10-2016, 20:47:16
var t = db.TransactionManager.TopTransaction;
Это не пройдёт - только для обычной транзакции есть TopTransaction
Так что транзакцию (OpenCloseTransaction) тебе придётся явно передавать. Но лучше всего в ObjectAppended ничего не делать вообще - только собирать ObjectId добавленных объектов. А обработку вести в других событиях. Например, в CommandEnded.
Название: Re: Обработка события добавления объекта в базу чертежа ObjectAppended
Отправлено: Вильдар от 18-10-2016, 20:49:04
Спасибо! Понял.
Название: Re: Обработка события добавления объекта в базу чертежа ObjectAppended
Отправлено: Владимир Шу от 19-10-2016, 08:45:17
Подобный вопрос уже был...
http://adn-cis.org/forum/index.php?topic=4302.msg16091#msg16091