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

31/08/2015

Сводная информация о контексте 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