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

24/06/2015

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

Обзор команд

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

Чтобы создать команду Fusion, сначала необходимо создать определение команды.Это именно то, что следует представляет название, это определение команды.Определение команды, прежде всего, определяет, как команда будет отображаться в пользовательском интерфейсе.Например, самый распространенный тип определения команды - это кнопка, и он содержит всю информацию для отображения кнопки в пользовательском интерфейсе: икона, всплывающая подсказка, включенное состояние, видимость и т.д.). В дополнение к кнопке есть также определение команд для одного флажка или списка переключателей, флажков, или текста.Все они описаны более подробно в теме Настройка пользовательского интерфейса .

После того как вы создали определение команды, вы можете добавить его в пользовательский интерфейс с помощью определения команды, чтобы создать элемент управления.Элемент управления ссылается на определение и отображает себя, используя информацию, которую он получает из определения. Это также обсуждается в теме Настройка пользовательского интерфейса  .Теперь пользователь имеет доступ к вашей команде и может запускать её, как и любую другую команду Fusion.

Кроме того, для обеспечения способа добавления кнопки в интерфейсе пользователя, другая важная вещь, которые делает определение команды - это уведомление надстройку, когда команда была запущена пользователем.Она делает это путем выполнения событие commandCreated, к которому надстройка подключается, когда создается определение команды. Все это позволяет надстройке определить свои команды, добавить их в пользовательский интерфейс, а затем пассивно запустить в фоновом режиме, ожидая уведомления событий, чтобы запустить одну из команд.

При запуске команды, Fusion создает новый объект команда  и запускает событие commandCreated, который передает объект Command для надстройки.Ваша надстройка реагирует на это событие, и либо сразу делает то, что действие команды должны делать, или это начинает сбор данных от пользователя. Ниже представлен полный код на Python для основной надстройки, которая создает командную кнопку, а затем ждет события, которое уведомляет её, когда кнопка была нажата пользователем, а затем сразу реагирует на это.В этом случае все что она делает - это отображает окно сообщения в ответ на созданное командой событие, но может делать что-нибудь другое.

Код - Python: [Выделить]
  1. import adsk.core, adsk.fusion, traceback
  2.  
  3. handlers = []
  4.  
  5. def run(context):
  6.  ui = None
  7.  try:
  8.    app = adsk.core.Application.get()
  9.    ui = app.userInterface
  10.  
  11.    # Получить коллекцию CommandDefinitions.
  12.    cmdDefs = ui.commandDefinitions
  13.  
  14. # Создание определение кнопки команды.
  15.    buttonSample = cmdDefs.addButtonDefinition('MyButtonDefIdPython', 'Sample Button',
  16.                          'Пример подсказки кнопки',
  17.                          './/Resources//Sample')
  18.  
  19. # Подключение к созданному командой событию.
  20.    sampleCommandCreated = SampleCommandCreatedEventHandler()
  21.    buttonSample.commandCreated.add(sampleCommandCreated)
  22.    handlers.append(sampleCommandCreated)
  23.  
  24. # Получить группу панелей Inspect.
  25.    inspectPanel = ui.allToolbarPanels.itemById('InspectPanel')
  26.  
  27.    # Добавить кнопку в нижней части.
  28.    buttonControl = inspectPanel.controls.addCommand(buttonSample, 'MyButtonControlIDPython')
  29.  
  30.  except:
  31.    if ui:
  32.      ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
  33.  
  34.  
  35. # Поддержка выгрузки надстройки.
  36. def stop(context):
  37.  try:
  38.    app = adsk.core.Application.get()
  39.    ui = app.userInterface
  40.  
  41.    # Очистить пользовательский интерфейс.
  42.    cmdDef = ui.commandDefinitions.itemById('MyButtonDefIdPython')
  43.    if cmdDef:
  44.      cmdDef.deleteMe()
  45.  
  46.    inspectPanel = ui.toolbarPanels.itemById('InspectPanel')
  47.    cntrl = inspectPanel.controls.itemById('MyButtonControlIDPython')
  48.    if cntrl:
  49.      cntrl.deleteMe()
  50.  
  51.  except:
  52.    if ui:
  53.      ui.messageBox('Сбой:\n{}'.format(traceback.format_exc()))
  54.  
  55.  
  56. # Обработка созданного командой события.
  57. class SampleCommandCreatedEventHandler(adsk.core.CommandCreatedEventHandler):
  58.  def __init__(self):
  59.    super().__init__()
  60.  def notify(self, args):
  61.    try:
  62.      app = adsk.core.Application.get()
  63.      ui = app.userInterface
  64.  
  65.      cmd = args.command
  66.  
  67.      ui.messageBox('Команда выполнена.')
  68.  except:
  69.    if ui:
  70.      ui.messageBox('Не удалось:\n{}'.format(traceback.format_exc()))

 

Ниже приведен эквивалентный код на JavaScript.

Код - JavaScript: [Выделить]
  1. function run(context) {
  2.  
  3.  "use strict";
  4.  if (adsk.debug === true) {
  5.    /*jslint debug: true*/
  6.    debugger;
  7.    /*jslint debug: false*/
  8.  }
  9.  
  10.  var ui;
  11.  try {
  12.    var app = adsk.core.Application.get();
  13.    ui = app.userInterface;
  14.  
  15.    // Получение коллекции CommandDefinitions.
  16.    var cmdDefs = ui.commandDefinitions;
  17.  
  18. // Создать определение кнопки команды.
  19.    var buttonSample = cmdDefs.addButtonDefinition('MyButtonDefIdJS', 'Sample Button',
  20.                            'Пример всплывающей подсказки кнопки',
  21.                            './/Resources//Sample');
  22.  
  23. // Подключите созданное кнопкой событие.
  24.    buttonSample.commandCreated.add(SampleCommandCreatedEventHandler);
  25.  
  26. // Получить группу панелей Inspect.
  27.    var inspectPanel = ui.allToolbarPanels.itemById('InspectPanel');
  28.  
  29.    // Добавление кнопки в нижней части.
  30.    var buttonControl = inspectPanel.controls.addCommand(buttonSample, 'MyButtonControlIDJS');
  31.  }
  32.  catch (e) {
  33.    if (ui) {
  34.      ui.messageBox('Failed : ' + (e.description ? e.description : e));
  35.    }
  36.  }
  37. }
  38.  
  39.  
  40. // Поддержка выгрузки надстройки.
  41. function stop(context) {
  42.  var ui;
  43.  try {
  44.    var app = adsk.core.Application.get();
  45.    ui = app.userInterface;
  46.  
  47.    // Очистка интерфейса.
  48.    var cmdDef = ui.commandDefinitions.itemById('MyButtonDefIdJS');
  49.    if (cmdDef) {
  50.      cmdDef.deleteMe();
  51.    }
  52.  
  53.    var inspectPanel = ui.toolbarPanels.itemById('InspectPanel');
  54.    var cntrl = inspectPanel.controls.itemById('MyButtonControlIDJS');
  55.    if (cntrl) {
  56.      cntrl.deleteMe();
  57.    }
  58.  }
  59.  catch (e) {
  60.    if (ui) {
  61.      ui.messageBox('Failed : ' + (e.description ? e.description : e));
  62.    }
  63.  }
  64. }
  65.  
  66.  
  67. // Обработка команды созданного события.
  68. var SampleCommandCreatedEventHandler = function(args) {
  69. try {
  70.   var cmd = args.command;
  71.  
  72.   var app = adsk.core.Application.get();
  73.   var ui = app.userInterface;
  74.   ui.messageBox('Команда выполнена.');
  75. }
  76. catch (e) {
  77.   if (ui) {
  78.     ui.messageBox('Failed : ' + (e.description ? e.description : e));
  79.   }
  80. }
  81. };

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

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

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

Опубликовано 24.06.2015
Отредактировано 08.07.2015 в 11:55:38