Как мне вызвать внешнее событие в Revit API из приложения WPF?

#c# #wpf #event-handling #revit-api

#c# #wpf #обработка событий #revit-api

Вопрос:

Я пытался создать плагин Revit, который позволяет пользователю просматривать проблемы, которые хранятся на удаленном сервере в локальной версии файла. Он должен создать новый перспективный 3D-вид из сохраненных данных на сервере и открыть его в Revit. Однако всякий раз, когда я пытаюсь его запустить, я получаю предупреждение об исключении таким образом:

 Exception thrown: 'Autodesk.Revit.Exceptions.InvalidOperationException' in RevitAPIUI.dll
An unhandled exception of type 'Autodesk.Revit.Exceptions.InvalidOperationException' occurred in RevitAPIUI.dll
Attempting to create an ExternalEvent outside of a standard API execution
  

Думаю, я смутно понимаю, что это значит, но я не уверен, что именно нужно изменить, чтобы это исправить. Я определяю пользовательский ExternalEventHandler и реализую его метод Execute:

 class CameraEventHandler : IExternalEventHandler
    {
        Issue issue;
        int i;

        public CameraEventHandler(Issue issue, int index)
        {
            this.issue = issue;
            this.i = index;
        }

        public void Execute(UIApplication app)
        {
            Document doc = app.ActiveUIDocument.Document;
            using (Transaction t = new Transaction(doc, "CameraTransaction"))
            {
                t.Start();
                ...
                //Irrelevant code to set camera position programmatically
                ...
                t.Commit();
            }
        }

        public string GetName()
        {
            return "Camera event handler";
        }
    }
  

А затем в одной из моих форм WPF я создаю ExternalEvent и вызываю метод Raise:

 private void RevitViewButton_Click(object sender, RoutedEventArgs e)
        {
            CameraEventHandler handler = new CameraEventHandler(issue, issueIndex);
            ExternalEvent cameraEvent = ExternalEvent.Create(handler);
            cameraEvent.Raise();
        }
  

Однако исключение выдается, когда оно достигает ExternalEvent .Создать метод.

Редактировать: я считаю, что стоит упомянуть, что приложение WPF, которое я использую, запускается как плагин Revit.

Ответ №1:

Revit API нельзя использовать вне допустимого контекста Revit API:

Это не ошибка, Газ, это задумано.

Решение, предложенное Gaz, абсолютно правильное!

Ответ №2:

Читая этот блог, кажется, что это ошибка в Revit.

Решение, по-видимому, заключается в создании вашего пользовательского обработчика во IExternalCommand.Execute время или IExternalApplication.OnStartup , а не во время создания события.