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

ADN Club => Revit API => Тема начата: enot от 16-11-2019, 15:56:52

Название: IExternalEventHandler
Отправлено: enot от 16-11-2019, 15:56:52
верно ли , что IExternalEventHandler можно создать только в классе IExternalApplication на стадии OnStartup ?
Название: Re: IExternalEventHandler
Отправлено: Вильдар от 16-11-2019, 18:22:35
IExternalEventHandler это же интерфейс!
Можно создать клас - реализацию.

Основной момент тут:
Код - C# [Выбрать]
  1. eventer = ExternalEvent.Create(EventHandler);
где, EventHandler это и есть объект класса реализующего этот интерфейс  :o
и вызывать eventer.Raise() когда нужно что-то делать в ревите, при этом вызовится Execute() в объекте EventHandler.

А ответ на вопрос - нет  ;D
Название: Re: IExternalEventHandler
Отправлено: enot от 16-11-2019, 18:36:46
тогда так.
если ревит запущен вы сможете создать ExternalEvent и выполнить его (Raise) ?
Пример. Цель создать команду (IExternalCommand для запуска из AddinManager) , которая выполнялась бы в контексте ревита

1) через AddinManager запускаем команду. Команда требует выполнения в контексте ревита. Ок. создаем тогда ExternalEvent  в этой команде . Тут же пробуем получить его для выполнения => получаем null

2) На стадии OnStartup создаем ExternalEvent  => проверяем - существует.

только в классе IExternalApplication
должно думаю работать еще если в манифесте прописать команду. Но это опять-таки перезапуск ревита нужен
Название: Re: IExternalEventHandler
Отправлено: Александр Игнатович от 17-11-2019, 10:37:03
Вот Вам рабочий пример:
Код - C# [Выбрать]
  1. [Transaction(TransactionMode.Manual)]
  2. public class TestCommand : IExternalCommand
  3. {
  4.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  5.         {
  6.                 var handler = new TestEventHandler();
  7.  
  8.                 handler.Initialize();
  9.  
  10.                 System.Threading.Tasks.Task.Factory.StartNew(() =>
  11.                         {
  12.                                 Thread.Sleep(TimeSpan.FromSeconds(5));
  13.  
  14.                                 handler.Raise();
  15.                         });
  16.  
  17.                 TaskDialog.Show("dev", "handler created");
  18.  
  19.                 return Result.Succeeded;
  20.         }
  21. }
  22.  
  23. public class TestEventHandler : IExternalEventHandler
  24. {
  25.         private ExternalEvent externalEvent;
  26.  
  27.         public void Initialize()
  28.         {
  29.                 externalEvent = ExternalEvent.Create(this);
  30.         }
  31.  
  32.         public void Raise() => externalEvent.Raise();
  33.  
  34.         public void Execute(UIApplication app) => TaskDialog.Show("dev", "Hello");
  35.  
  36.         public string GetName() => nameof(TestEventHandler);
  37. }