Как вариант возможно всё портят транзакции. Попробуй их все заменить на OpenCloseTransactionЭто я уже пробовал, к сожалению, неоднократно. В этом случае вообще все перестает работать, то с ошибкой eWasOpenForRead, то с eLockViolation, то просто с фаталом. В общем - там только StartTransaction() и работает.
Завтра еще попробую сделать проект под другую версию автокада и протестировать. Если такого не будет - значит глюк 2010 автокада. Хотя, от этого легче не станетНе дождался до завтра и проверил сегодня - то же самое. Значит это не глюк 2010 автокада
В этом случае вообще все перестает работать, то с ошибкой eWasOpenForRead, то с eLockViolation, то просто с фаталом. В общем - там только StartTransaction() и работает.Не верю. Это говорит лишь о том, что ты что-то делаешь неправильно.
С этими транзакциями прям беда. Одна из главных проблем OpenCloseTransaction в том, что нельзя открывать в них вложенные транзакции. Но и я не могу использовать OpenCloseTransaction для создания, а не редактирования блока. Получается, что при получении BlockTableRecord (код, который я приложил) нужно учитывать три варианта работы - использовать OpenCloseTransaction , использовать обычную транзакцию или использовать TopTransaction.В этом случае вообще все перестает работать, то с ошибкой eWasOpenForRead, то с eLockViolation, то просто с фаталом. В общем - там только StartTransaction() и работает.Не верю. Это говорит лишь о том, что ты что-то делаешь неправильно.
Как вариант возможно всё портят транзакции. Попробуй их все заменить на OpenCloseTransaction
Не верю. Это говорит лишь о том, что ты что-то делаешь неправильно.В общем - не помогает. Сделал отдельный метод:
С этими транзакциями прям беда. Одна из главных проблем OpenCloseTransaction в том, что нельзя открывать в них вложенные транзакции.Разве? А что мешает?
Не верю. Это говорит лишь о том, что ты что-то делаешь неправильно.Вот тут я согласен с Александром Наумовичем. Тут вот в чем дело. Транзакции хорошо использовать в простых сценариях, например: выбрал объекты на чертеже, открыл транзакцией, модифицировал, закрыл. Когда производишь обработку в методах Overrule или в обработчиках событий, работаешь с неактивным документом и пр. продвинутые сценарии - то транзакции могут сбоить. Можно рискнуть и попробовать их использовать, но проще сразу писать код без них.
eWasOpenForReadВыдается при попытке модифицировать объект, который открыт на чтение.
eLockViolationПопытка внести изменения в незаблокированный документ.
Разве? А что мешает?Вот тут (http://spiderinnet1.typepad.com/blog/2012/08/autocad-net-openclosetransaction-can-it-be-nested.html)с примером описано про это
Вот тут я согласен с Александром Наумовичем. Тут вот в чем дело. Транзакции хорошо использовать в простых сценариях, например: выбрал объекты на чертеже, открыл транзакцией, модифицировал, закрыл. Когда производишь обработку в методах Overrule или в обработчиках событий, работаешь с неактивным документом и пр. продвинутые сценарии - то транзакции могут сбоить. Можно рискнуть и попробовать их использовать, но проще сразу писать код без них.Да я во многом согласен. Вот этот код, который в топике, где меняются примитивы в BlockTableRecord хотелось бы сделать универсальным, но видимо не получится. При создании объекта и работе Jig все нормально. При работе с ручками получается и вариант с транзакцией и вариант с эмуляцией транзакции. Но вот к работе с ObjectOverrule он не подходит, т.к. BlockReference уже открыт. А еще там могут создаваться копии объекта
Простая замена Transaction на OpenCloseTransaction - это не выход. Нужно тщательно следить за всеми открытыми объектами. Закрывать их сразу, как только они перестают быть нужными. Следить, чтобы открытый на запись объект случайно не открывался повторно и т.д. и т.п. Сам на этом регулярно спотыкаюсь. Часто вместо OpenCloseTransaction лучше напрямую открывать объект через ObjectId.Open с использованием блока using. Потому что открытый в OpenCloseTransaction объект остается открытым до тех пор, пока выполнение не дойдет до Commit или Abort.
P.S. Как-то Александр Наумович говорил, что транзакции менее требовательны к качеству кода и прощают многие ошибки разработчика. Если запустить такой код без транзакций, то все это выплывает наружу
Вот тут с примером описано про этоНу так надо делать правильные выводы. Вывод из этого примера: нельзя дважды открыть объект на запись при использовании OpenCloseTransaction, в отличие от Transaction. Заменить в первой транзакции OpenMode.ForWrite на OpenMode.ForRead (ну и убрать модификацию объекта в первой транзакции) - и все нормально отработает.
Ну так надо делать правильные выводы. Вывод из этого примера: нельзя дважды открыть объект на запись при использовании OpenCloseTransaction, в отличие от Transaction. Замени в первой транзакции OpenMode.ForWrite на OpenMode.ForRead (ну и убрать модификацию объекта в первой транзакции) - и все нормально отработает.Я про это уже выше писал - про универсальность - в какой-то момент это так и срабатывает, а в какой-то - ровно наоборот (т.е. передается объект открытый на чтение и нужно открыть на запись). Придется делать различные методы - для вызова из Jig, для вызова из GripsOverrule и для вызова из ObjectOverrule. Причем два последних еще вдобавок и коррелируют между собой, и создают копии
Это тоже может быть связанно с транзакциями? Срабатывание метода Close() происходит одновременно или по очереди для всех объектов?Одновременно не может быть - это очевидно.