Создание пользовательских команд Fusion - Часть 3
Чтобы использовать командные входы, ваша надстройка реагирует на созданные командой события и создает нужные командные входы для вновь созданного объекта Command, который передается вам через событие. После того как вы создали команду входов, Fusion отображает диалоговое окно, чтобы предоставить пользователю осуществить ввод. Используя других событий, как описано ниже, вы можете проверить вход, реагировать на изменения, и отобразить предварительный просмотр ожидаемого результата. Наконец, когда кнопка ОК нажата, можно выполнить все, что представляет из себя окончательное решение.
Ниже приведена новая версия SampleCommandCreatedEventHandler на Python из предыдущего примера выше. В этом случае он не только немедленно выполняет любое действие, которое делает команда, но вместо этого он создает три командных входа, чтобы получить дополнительный ввод от пользователя, что вернет показанный ниже диалог. В дополнение к созданию командных входов, новый код также подключается к двум связанным с командой событиям таким образом, что он может изменить диалог, пока команда работает и, наконец, он может выполнять задачи, которые команда должны делать.
- # Обработка созданного командой события.
- class SampleCommandCreatedEventHandler(adsk.core.CommandCreatedEventHandler):
- def __init__(self):
- super().__init__()
- def notify(self, args):
- app = adsk.core.Application.get()
- ui = app.userInterface
- try:
- # Получить команду.
- cmd = args.command
- # Получить коллекцию CommandInputs для создания новых входов команд.
- inputs = cmd.commandInputs
- # Создание вход выбора, для получения твердое тело.
- selInput = inputs.addSelectionInput('SolidBodySelect', 'Solid body', 'Select solid body to intersect.')
- selInput.setSelectionLimits(1,1)
- selInput.addSelectionFilter('SolidBodies')
- # Создание логического входа, для получения упрощенных настроек.
- approxInput = inputs.addBoolValueInput('ApproxWithLines', 'Approximate with lines', True, '', True)
- # Создание входного значения, чтобы получить допуск.
- app = adsk.core.Application.get()
- unitsMgr = app.activeProduct.unitsManager
- tolInput = inputs.addValueInput('TolValue', 'Tolerance', unitsMgr.defaultLengthUnits, adsk.core.ValueInput.createByReal(0.1))
- # Подключение к связанным с командой событиям.
- onExecute = CommandExecutedHandler()
- cmd.execute.add(onExecute)
- handlers.append(onExecute)
- onInputChanged = InputChangedHandler()
- cmd.inputChanged.add(onInputChanged)
- handlers.append(onInputChanged)
- except:
- if ui:
- ui.messageBox('command created failed:\n{}'.format(traceback.format_exc()))
Событие выполнения запускается, когда пользователь нажимает кнопку ОК в диалоге для завершения команды, и это то место, где надстройка будет делать все, что делает команда. Кнопка ОК не включена, до тех пор, пока не были введены все необходимые исходные данные. Многое из этого определяется автоматически Fusion, но вы также можете сделать динамически дополнительную проверку с помощью события ValdiateInputs. Все работы, проделанные в событии выполнения объединяются в одну транзакцию, поэтому они могут быть отменены одной отменой.
Код Python ниже показывает реакцию на событие выполнения путем извлечения входов, а затем выполнения чего-либо, что в данном случае является просто отображением информации в окне сообщения.
- # Поддержка выполненного командой события.
- class CommandExecutedHandler(adsk.core.CommandEventHandler):
- def __init__(self):
- super().__init__()
- def notify(self, args):
- app = adsk.core.Application.get()
- ui = app.userInterface
- try:
- cmd = args.firingEvent.sender
- # Получить данные и настройки из входов команды.
- bodyInput = cmd.commandInputs.itemById('SolidBodySelect')
- body = bodyInput.selection(0).entity
- bodyName = body.name
- approxBool = cmd.commandInputs.itemById('ApproxWithLines')
- if approxBool.value == True:
- tolInput = cmd.commandInputs.itemById('TolValue')
- intersectionMsg = 'approximate intersection (' + tolInput.expression + ')'
- else:
- intersectionMsg = 'exact intersection'
- # Сделать что-нибудь с результатами.
- ui.messageBox('Processing ' + bodyName + ' using ' + intersectionMsg)
- except:
- if ui:
- ui.messageBox('command executed failed:\n{}'.format(traceback.format_exc()))
Событие inputChanged выполняется, когда пользователь изменяет любое из значений в диалоговом окне. В приведенном выше примере, это используется, чтобы увидеть, является ли состояние флажка включенным, или выключенным, и изменяет видимость настроек допуска, так как они не применяются, если флажок не установлен. Диалоговое окно может быть в одном из двух состояний, которые приведены ниже.
- # Поддержка изменяемого вводом события.
- class InputChangedHandler(adsk.core.InputChangedEventHandler):
- def __init__(self):
- super().__init__()
- def notify(self, args):
- app = adsk.core.Application.get()
- ui = app.userInterface
- try:
- command = args.firingEvent.sender
- # Проверить, изменился ли логический вход "Approximate with lines"
- # и изменить состояние входного допуска.
- if args.input.id == 'ApproxWithLines':
- # Получить вход допуска.
- tolInput = command.commandInputs.itemById('TolValue')
- # Проверьте значение флажка и изменить
- # состояние "включен" ввода допуска.
- approxInput = args.input
- if approxInput.value:
- tolInput.isVisible = True
- else:
- tolInput.isVisible = False
- except:
- if ui:
- 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