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

17/07/2015

События в Fusion API

События являются возможностью получать Вами уведомления, когда в Fusion происходят определенные действия. События являются ключевым компонентом команд Fusion. Именно через события ваша программа может знать, что пользователь нажал кнопку, связанную с вашей командой, а затем указал входные данные через командный диалог вашей надстройки, на который она может реагировать путем проверки ввода и показывая предварительный просмотр. Наконец, посредство событий Ваша программа будет уведомлена о том, чтобы выполнить команду и создать окончательный результат.

Большинство событий, поддерживаемых в настоящее время связаны с командами, и вы можете увидеть конкретные примеры использования этих событий в теме о командах. Чтобы продемонстрировать общую концепцию, как использовать событие я буду использовать более общий случай, который исполняется Fusion, когда активируется рабочая среда. Основные понятия, обсуждаемые ниже, относятся ко всем событиям. Все поддерживаемые события перечислены в справке Fusion API под объектом, который поддерживает это событие.Например, события, связанные с рабочей областью, поддерживаются объектом UserInterface, как показано ниже. Объект UserInterface поддерживает четыре события: workspaceActivated, workspaceDeactivated, workspacePreActivate и workspacePreDeactivate.

 

Для реализации события нужно добавить функцию "handler" в ваш код и подключить этот обработчик к событию. Fusion будет вызывать функцию обработчика, когда в Fusion действие происходит, которое приводит к выполнению события. Даже если концепция реализации событие является таким же, реальная практика довольно сильно отличается для разных языков. Ниже приведены сценарии JavaScript и Python, которые делают одно и то же: подключаются к событию WorkspaceActivated и реагируют на него, но как вы видите, код довольно различный. Шаги и детали реализации описываются ниже.

JavaScript

Код - JavaScript: [Выделить]
  1. var MyWorkspaceActivatedHandler = function(args) {
  2. var ws = args.workspace;
  3. var app = adsk.core.Application.get();
  4. var ui = app.userInterface;
  5. ui.messageBox(ws.name + ' workspace was activated (JavaScript).'); 
  6. };
  7.  
  8. function run(context) {
  9. var app = adsk.core.Application.get();
  10. var ui = app.userInterface;
  11. ui.workspaceActivated.add(MyWorkspaceActivatedHandler);
  12. ui.messageBox('Event connected.');
  13. }

 

Python

Код - Python: [Выделить]
  1. import adsk.core, adsk.fusion, traceback
  2. handlers = []
  3. class MyWorkspaceActivatedHandler(adsk.core.WorkspaceEventHandler):
  4. def __init__(self):
  5. super().__init__()
  6. def notify(self, args):
  7. ws = args.workspace
  8. app = adsk.core.Application.get()
  9. ui = app.userInterface
  10. ui.messageBox(ws.name + ' workspace was activated (Python).') 
  11.  
  12. def main():
  13. app = adsk.core.Application.get()
  14. ui = app.userInterface
  15. onWorkspaceActivated = MyWorkspaceActivatedHandler()
  16. ui.workspaceActivated.add(onWorkspaceActivated)
  17. handlers.append(onWorkspaceActivated)
  18.  
  19. ui.messageBox('Event connected.')
  20. adsk.autoTerminate(False)
  21.  
  22. main()

Для реализации события вам необходима функция-обработчик событий. Ниже описывается, как сделать это как в JavaScript, так и в Python.

Обработчик событий в JavaScript

Строки кода 1-7 JavaScript содержат функцию обработчика событий. Функция называется MyWorkspaceActivatedHandler, но это может быть любое имя. В JavaScript, все обработчики событий реализованы как функции одним аргументом "args". Что передано через этот аргумент args, различается для различных событий и, то как определить, что прошло для конкретного события, обсуждается ниже.

Следующим шагом является подключение обработчика к событию. Это делается в строке 14, где вызывается метод добавления объекта WorkspaceEvent (который возвращается свойством UserInterface.workspaceActivated) и куда передается обработчик события. Когда выполняется код JavaScript, он подключает событие, а затем продолжает работать в фоновом режиме, что позволяет его обработчик быть вызываемым и реагировать на события.

Обработчик событий в Python

Линии 5-13 кода Python содержат обработчик событий. Для Python обработчик событий реализован как класс. Класс может иметь любое имя, но в этом примере назван MyWorkspaceActivatedHandler. В строке 5 можно увидеть, что класс наследуется от adsk.core.WorkspaceEventHandler. Это класс, который должен быть реализован в для этого события. Определение этого класса, обсуждается ниже.

Метод __init__ класса - как видно на линиях 6-7 - точно одинаковый для всех событий. Метод уведомления также одинаков для всех событий, но, конечно, код реализации в пределах события будет варьироваться в зависимости от того, что вам нужно сделать в ответ на событие. Хотя все события имеют аргумент args, объект, передаваемый через этот аргумент изменяется в зависимости от события. Определение того, какой объект прошел через аргумент args описано ниже.

Следующим шагом является подключение обработчика к событию. Это делается в строках 20-22.Объявление в строке 3, также необходимо, как часть этого. Строка 20 присваивает ссылку на обработчик событий для переменной. Вызывается метод добавления для объекта WorkspaceActivated и передается ссылка переменной на функцию MyWorkspaceActivateHandler . Для того, чтобы удержать обработчик от выхода за рамки и освобождения, он добавляется в список обработчиков, которые объявлены на глобальном уровне в строке 6 и остаются в течении жизни сценария.

Сценарий Python (не надстройка) автоматически прекращаются, когда он выполняется. Чтобы сценарий продолжал работать так, чтобы он мог реагировать на события, вызывается функция autoTerminate в строке 26, со значением Ложь в качестве аргумента, чтобы указать Fusion, что сценарий должен продолжать работать в фоновом режиме.

Получение информации о событии из справки API

Как было показано выше, события, поддерживаемые каждым объектом, перечислены в разделе данного объекта.На рисунке ниже, была выбрана ссылка события UserInterface.workspaceActivated, где мы можем видеть, что это событие реализовано в рамках объекта WorkspaceEvent.

 

Нажатие на ссылки WorkspaceEvent показывает тему ниже, где самым важным является метод add, и он существует для всех типов событий.

 

Нажатие на ссылку add отображает тему, показанную ниже, где мы видим, что аргумент обработчика имеет тип WorkSpaceEventHandler.Это класс, который должен быть реализован для того, чтобы поддерживать это событие.В Python необходимо указать, какой класс наследует класс обработчика событий, и этот класс, что видно в строке 5 кода Python выше.

 

Нажатие на ссылку WorkspaceEventHandler, а затем, нажатие на ссылку метода уведомления, отобразит тему, показанную ниже. Интересно здесь то, что аргумент eventArgs метода уведомления возвращает объект WorkspaceEventArgs.

 

И, перейдя по ссылке для этого объекта, вы можете увидеть, к какой информации вы можете получить доступ через его свойства. В этом случае, важной информацией, которую он предоставляет, является объект WorkSpace, который только что был активирован при помощи свойства рабочего пространства, который используется в примерах программ выше в строке 2 программы JavaScript и строке 9 программы Python.

 

 

Автор перевода: Дмитрий Емельянов

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

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