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

27/11/2014

Использование групп транзакций для освобождения элементов без сохранения или синхронизации

Вопрос: У меня есть файл, открытый в Revit и который я изменяю своей надстройкой. Могу ли я программно закрыть файл без синхронизации, сохранения и оставления элементов заимствованными текущим пользователем?

Есть возможность освободить не редактированные элементы с помощью метода WorksharingUtils.RelinquishOwnership. Но этот метод не освобождает редактируемые элементы.

Документация к методу Document.Close также не содержит информации о том, как освободить элементы.

Есть ли какой-нибудь способ добиться желаемого результата, без сохранения или повторного открытия той же самой модели?

Ответ: Спасибо за интересный вопрос.

Очевидным способом является группировка всех действий, выполняемых вашей надстройкой, в группу транзакций и последующим откатом этой группы транзакций перед закрытием документа.

Ответ: Действительно, откат транзакции выглядит очевидным. К сожалению, проблема в том, что надстройке я работаю с большим количеством транзакций, которые должны быть подтверждены, до того, как мне нужно будет откатить изменения.

Насчет группы транзакций.

Если я подтверждаю транзакции, которые блокируют элементы, внутри группы транзакций и затем делаю откат группы транзакция, произойдет освобождение блокированных элементов?

Во всяком случае те элементы уже не будут модифицированы, и метод WorksharingUtils.RelinquishOwnership в любом случае должен сработать.

Ответ: Точно.

Некоторые методы Revit API требуют подтверждения транзакций, перед тем, как переходить к вызову другого метода.

Все транзакции могут быть окончательно подтверждены или быть отменены, если эти транзакции были в группе транзакций.

Вот что говорит документация по классу TransactionGroup:

Группы транзакций агрегируют несколько транзакций.

С помощью группы транзакций можно осуществлять контроль над тем, будут ли транзакции внутри группы оставаться подтвержденными или они должны быть отменены. Если группа транзакций подтверждена, то все транзакции внутри группы также останутся подтвержденными. Но если же группа транзакций была отменена, то все подтвержденные транзакции внутри этой группы также будут отменены и уничтожены.

Есть два способа подтвердить группу транзакций – Commit и Assimilate. С помощью метода Commit, все транзакции внутри группы останутся так как они есть, а методом Assimilate, все транзакции внутри группы будут объединены в одну транзакцию.

Группа транзакций может быть начата в тот момент, когда нет ни одной активной транзакции и может быть завершена, только когда все транзакции внутри нее также завершены. Т.е. подтверждены или отменены.

Внутри группы транзакций можно также создать еще одну группу.

Так же, как и сами транзакции, наиболее надёжным способом будет использование групп транзакций внутри блока using.

Источник: http://thebuildingcoder.typepad.com/blog/2014/11/cloud-accelerator-vdc-and-transaction-groups.html#4

Обсуждение: http://adn-cis.org/forum/index.php?topic=1109

Опубликовано 27.11.2014