Сводная информация о контексте Revit API
Вопрос: Не разрешается запустить новую транзакцию при вызове из внешнего приложения и запущенного вне контекста Revit API. Как быть?
Ответ: Распаковав свой магически шар для чтения чужих мыслей, я так полагаю, вы спрашиваете о том, как избежать сообщения об ошибке, что невозможно запустить транзакцию вне контекста Revit API. Вот немного дополнительной информации:
- Все вызовы методов Revit API должна находится внутри так называемого контекста Revit API
- Этот контекст живет в специальном потоке
- Вероятней всего вы пытаетесь использовать методы Revit API из другого потока
- Чаще всего это происходит, когда вы используете Форму и пытаетесь вызвать метода Revit API в обработке какого-либо события, например, нажатия кнопки.
Таким образом, вам нужно разобраться, как можно и нужно правильно вернуться к контексту Revit API для вызова вашего кода. Для этого существует два основных способа, не считая того, что вы уже используете IExternalCommand.Execute:
- Выполнять методы Revit API в обработке события Idling
- Использовать внешние события ExternalEvent
Так как в тегах вы упомянули о RevitPythonShell, то почему бы вам не взглянуть, как я это делал в статье использование внешних событий в браузере (на англ.):
- Создается класс, реализующий интерфейс IExternalEventHandler
- В методе Execute реализуете ваш код с вызовом методов Revit API
- Создаете объект класса ExternalEvent с использованием класса, который вы создали ранее.
- В момент, когда нужно вызвать методы Revit API, вызовите метод my_external_event.Raise()
Дополнительную информацию можно найти на сайте The Building Coder (на англ.)
Источник: http://thebuildingcoder.typepad.com/blog/2015/08/revit-api-context-and-form-creation-errors.html#2
Обсуждение: http://adn-cis.org/forum/index.php?topic=2963
Опубликовано 31.08.2015