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

27/06/2015

Создание пользовательских команд Fusion - Часть 3

Чтобы использовать командные входы, ваша надстройка реагирует на созданные командой события и создает нужные командные входы для вновь созданного объекта Command, который передается вам через событие. После того как вы создали команду входов, Fusion отображает диалоговое окно, чтобы предоставить пользователю осуществить ввод. Используя других событий, как описано ниже, вы можете проверить вход, реагировать на изменения, и отобразить предварительный просмотр ожидаемого результата. Наконец, когда кнопка ОК нажата, можно выполнить все, что представляет из себя окончательное решение.

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

 

Код - Python: [Выделить]
  1. # Обработка созданного командой события.
  2. class SampleCommandCreatedEventHandler(adsk.core.CommandCreatedEventHandler):
  3. def __init__(self):
  4.   super().__init__()
  5. def notify(self, args):
  6.   app = adsk.core.Application.get()
  7.   ui = app.userInterface
  8.   try:
  9.     # Получить команду.   
  10.     cmd = args.command
  11.  
  12.     # Получить коллекцию CommandInputs для создания новых входов команд.       
  13.     inputs = cmd.commandInputs
  14.  
  15.     # Создание вход выбора, для получения твердое тело.
  16.     selInput = inputs.addSelectionInput('SolidBodySelect', 'Solid body', 'Select solid body to intersect.')
  17.     selInput.setSelectionLimits(1,1)
  18.     selInput.addSelectionFilter('SolidBodies')
  19.  
  20.     # Создание логического входа, для получения упрощенных настроек.
  21.     approxInput = inputs.addBoolValueInput('ApproxWithLines', 'Approximate with lines', True, '', True)
  22.  
  23.     # Создание входного значения, чтобы получить допуск.
  24.     app = adsk.core.Application.get()
  25.     unitsMgr = app.activeProduct.unitsManager
  26.     tolInput = inputs.addValueInput('TolValue', 'Tolerance', unitsMgr.defaultLengthUnits, adsk.core.ValueInput.createByReal(0.1))
  27.  
  28.     # Подключение к связанным с командой событиям.
  29.     onExecute = CommandExecutedHandler()
  30.     cmd.execute.add(onExecute)
  31.     handlers.append(onExecute)
  32.  
  33.     onInputChanged = InputChangedHandler()
  34.     cmd.inputChanged.add(onInputChanged)
  35.     handlers.append(onInputChanged)
  36.   except:
  37.     if ui:
  38.       ui.messageBox('command created failed:\n{}'.format(traceback.format_exc()))

Событие выполнения запускается, когда пользователь нажимает кнопку ОК в диалоге для завершения команды, и это то место, где надстройка будет делать все, что делает команда. Кнопка ОК не включена, до тех пор, пока не были введены все необходимые исходные данные. Многое из этого определяется автоматически Fusion, но вы также можете сделать динамически дополнительную проверку с помощью события ValdiateInputs. Все работы, проделанные в событии выполнения объединяются в одну транзакцию, поэтому они могут быть отменены одной отменой.

Код Python ниже показывает реакцию на событие выполнения путем извлечения входов, а затем выполнения чего-либо, что в данном случае является просто отображением информации в окне сообщения.

Код - Python: [Выделить]
  1. # Поддержка выполненного командой события.
  2. class CommandExecutedHandler(adsk.core.CommandEventHandler):
  3. def __init__(self):
  4.   super().__init__()
  5. def notify(self, args):
  6.   app = adsk.core.Application.get()
  7.   ui = app.userInterface
  8.   try:
  9.     cmd = args.firingEvent.sender
  10.  
  11.     # Получить данные и настройки из входов команды.
  12.     bodyInput = cmd.commandInputs.itemById('SolidBodySelect')
  13.     body = bodyInput.selection(0).entity
  14.     bodyName = body.name
  15.  
  16.     approxBool = cmd.commandInputs.itemById('ApproxWithLines')
  17.     if approxBool.value == True:
  18.       tolInput = cmd.commandInputs.itemById('TolValue')
  19.       intersectionMsg = 'approximate intersection (' + tolInput.expression + ')'
  20.     else:
  21.       intersectionMsg = 'exact intersection'
  22.  
  23.     # Сделать что-нибудь с результатами.
  24.     ui.messageBox('Processing ' + bodyName + ' using ' + intersectionMsg)
  25.   except:
  26.     if ui:
  27.       ui.messageBox('command executed failed:\n{}'.format(traceback.format_exc()))

Событие inputChanged выполняется, когда пользователь изменяет любое из значений в диалоговом окне. В приведенном выше примере, это используется, чтобы увидеть, является ли состояние флажка включенным, или выключенным, и изменяет видимость настроек допуска, так как они не применяются, если флажок не установлен. Диалоговое окно может быть в одном из двух состояний, которые приведены ниже.

 

Код - Python: [Выделить]
  1. # Поддержка изменяемого вводом события.
  2. class InputChangedHandler(adsk.core.InputChangedEventHandler):
  3. def __init__(self):
  4.   super().__init__()
  5. def notify(self, args):
  6.   app = adsk.core.Application.get()
  7.   ui = app.userInterface
  8.   try:
  9.     command = args.firingEvent.sender
  10.  
  11.     # Проверить, изменился ли логический вход "Approximate with lines"
  12.     # и изменить состояние входного допуска.
  13.     if args.input.id == 'ApproxWithLines':
  14.       # Получить вход допуска.         
  15.       tolInput = command.commandInputs.itemById('TolValue')
  16.  
  17.       # Проверьте значение флажка и изменить
  18.       # состояние "включен" ввода допуска.
  19.       approxInput = args.input
  20.       if approxInput.value:
  21.         tolInput.isVisible = True
  22.       else:
  23.         tolInput.isVisible = False
  24.   except:
  25.     if ui:
  26.       ui.messageBox(Input change failed:\n{}'.format(traceback.format_exc()))

В дополнение к этим событиям есть несколько других команд, связанных с событиями. Это activate, deactivate, destroy, executePreview и validateInputs.События activate и deactivate используются, когда выполняется сборная команда, а ваша команда работает. Например, если пользователь выполняет команду просмотра, ваша команда временно отключается и выполняется событие деактивации. Когда контроль возвращается к вашей команда, выполняется событие активирования. Событие уничтожения выполняется, когда команда уничтожена.

Событие executePreview позволяет осуществить предварительный просмотр ожидаемых результатов вашей команды. Обычно вы будете выполнять ту же функцию, в executePreview, что и в случае выполнения. То есть вы будете создавать желаемый результат. ExecutePreview вызывается, когда данные корректны и в любое время любой из входов изменен. Fusion автоматически прерывает предыдущую транзакцию, где просмотр был создан, так что каждый раз вы начинаете с чистого листа. Для сложных и трудоемких заданий вы можете иметь специальную функцию, которую вы вызываете для executePreview вместо того, чтобы делать полное создание. Когда происходит выполнение события, любые предварительные просмотры прерываются и выполняется последняя работа в событии выполнения.

Событие validateInputs позволяет проверить все входы и применять какие-либо специальные критерии проверки, которые у вас есть и вернуться из события, которое указывает, все ли входы верные. Это контролирует является ли кнопка ОК включенной. Fusion выполняет много проверок как самостоятельно, так во многих случаях вы можете просто не использовать это событие. Например, если у вас есть команда, которой требуется два выбора и только одно значение введено, Fusion не включит кнопку ОК, пока оба выбора не будут сделаны, и заданное значение не является действительным.

Источник: http://fusion360.autodesk.com/resources

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

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

Опубликовано 27.06.2015
Отредактировано 08.07.2015 в 12:59:11