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

17/06/2015

Надстройки Fusion 360

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

Создание надстройки

Чтобы создать новую команду, используйте "Scripts and Add-Ins" и выберите опцию "Add-In", как указано ниже. Надстройки могут быть созданы как при помощи Python, так и JavaScript.

 

Используя диалог, вы можете указать имя и другие атрибуты надстройки, как описано ниже.

  • Выполнить при запуске - Указывает, должна ли надстройка быть автоматически запущена при запуске Fusion.Пользователь может выбрать для загрузки или остановить запущенную надстройку в любое время посредством команды "Scripts and Add-Ins".
  • Сценарий или имя надстройки - Это имя надстройки.Это имя будет использоваться для создания новой папки в расположении, указанном в "Folder Location", и это также будет использоваться в качестве имени файла кода надстройки (.py или .js).
  • Описание - описание надстройки.
  • Автор - имя автора надстройки.
  • Версия - Версия надстройки.Это строка и может быть любой формы метки версии, например "1.0.0 "," 2016 "," R1 "," V2 ", и т.д.
  • Целевая Операционная система - Указывает, какую операционную систему(ы) надстройка должна загружать автоматически, если выбран параметр "Выполнить при запуске".Например, если надстройка использует специфические библиотеки Windows библиотек вы должны установить значение "Windows". Так Fusion не будет пытаться загрузить надстройку на Mac.
  • Место расположения папки - место, где будут создана надстройка.Когда вы создаете новую надстройку с помощью диалогового окна, создается новый каталог с названием надстройки и файлы надстройки создаются в указанном месте.Места по умолчанию для надстроек, приведены ниже:
  •  Windows – %appdata%\Autodesk\Autodesk Fusion 360\API\AddIns
  •  Mac – $HOME/Library/Application Support/Autodesk/Autodesk Fusion 360/API/AddIns

Надстройки могут существовать в любом месте на машине, но это единственное расположение, где Fusion автоматически ищет надстройки при запуске.Надстройки в любом другом месте должна быть указана явно с помощью команды "Scripts and Add-Ins". При копировании или установке надстройки на компьютер, вы должны скопировать её в месте, указанне выше, так что Fusion сможет автоматически его найти.

Файлы надстроек

Когда создана новая надстройка, создаются файлы кода (.py файлы для Python, а .js и .html файлы для JavaScript).В дополнение к стандартным файлам сценариев, также создается файл .manifest файл , который содержит дополнительную информацию.Например, если вы создаете надстройку Python с названием MyAddIn, в папке "…/Autodesk/Autodesk Fusion 360/API/AddIns/" создаются файлы и папка MyAddIn, как показано ниже.

 

Манифест файла

Файл .manifest содержит информацию о надстройке, которую Fusion использует для определения, когда и вообще должна ли быть надстройка загружена. Он также содержит другие сведения, такие как описание, которая отображается пользователю в диалоге "Scripts and Add-Ins" и автор надстройки. Файл манифеста имеет то же имя, что и надстройка, с расширением .manifest. Это текстовый файл в формате JSON. Ниже показан пример типичного файла манифеста и описание каждого из свойств.

Код - Python: [Выделить]
  1. {
  2.   "autodeskProduct""Fusion360",
  3.   "type""addin",
  4.   "id""62a9e55a-dbe4-408d-ad8b-cb802473725e",
  5.   "author""Brian Ekins",
  6.   "description"{
  7.     """This is a test add-in."
  8.   },
  9.   "version""V1",
  10.   "runOnStartup":  true,
  11.   "supportedOS""windows|mac"
  12. }

 

  • autodeskProduct - это свойство всегда будет иметь значение "Fusion360".
  • type - это свойство может быть "addin" или "script", чтобы определить, является эта программа надстройки или сценарием.Использование файла манифеста со сценарием является не обязательным, но оно поддерживается.
  • id - Это свойство GUID, который однозначно идентифицирует эту надстройку.Если вы создаете новую надстройку или сценарий, копируя существующую надстройку или сценарий, вы должны заменить этот идентификатор с новым GUID так каждый id уникален.Это в настоящее время не используются Fusion, но, вероятно, будет использоваться в будущем.
  • author - Это строковое свойство, содержащая имя автора.Это отображается в диалоге "Scripts and Add-Ins".
  • description - Это объект JSON со свойствами, определяющими описание надстройки.Используя формат JSON, он определен как объект с одним или несколькими свойствами, так что описание может быть задано на нескольких языках. Пример ниже имеет одно свойство с пустым именем, которое явояется описанием по умолчанию, и будет использоваться для любого языка, который не имеет конкретного описания.Остальные три свойства определяют текст, используемый для английского, итальянского и китайского, для которого язык указан с помощью кода языков промышленных стандартов.

Код - JavaScript: [Выделить]
  1. "Description":{
  2.   "":"Default description",
  3.   "1033": "Description in English"
  4.   "1040": "Descrizione in Italiano"
  5.   "1028": "說明在中國"
  6. }

  • version - Это свойство определяет версию надстройки и может быть любой строкой, т.е. "1.0.0”, “2016”, “R1”, “V2”, и т.д.
  • runOnStartup - Это свойство может принимать значение ИСТИНА или ЛОЖЬ, и указывает, должна ли эта надстройка запускаться Fusion автоматически при его запуске.
  • supportedOS - это свойство может быть "Windows", "Mac", или "Windows| Mac".Это определяет, в каких операционных системах надстройка будет загружаться.Одним из примеров, где это используется - это в случай, когда надстройка использует специальные библиотеки ОС - так надстройка не будет работать на любой другой ОС. Например, если я пишу надстройку, которая использует определенную библиотеку Windows, я могу установить supportedOS в "Windows" - так на Mac Fusion не будет отображать надстройку в "Scripts and Add-Ins", а также не будет пытаться запустить её при старте.Большинство надстроек должны быть совместимы как с Mac и Windows, так что это должно быть установлено к "Windows |Mac", чтобы указать, что надстройка может быть загружена для обеих операционных систем.

Код надстройки

Код в надстройке немного отличается от типичного сценария, потому что выполнение надстройки более контролируемое, чем сценарий. Надстройки должны содержать и функции "run" и "stop". При использовании диалогового окна "Scripts and Add-Ins" для создания новой надстройки, функции "run" и "stop" существуют в исходном коде, как показано ниже. Функция "run" вызывается Fusion, когда надстройка изначально загружена.Именно в этой функции, надстройка будет использовать API Fusion для создания своих команд, добавления элементов управления пользовательского интерфейса, и подключаться к событиям на которые она хочет реагировать.После завершения выполнения метода "run" надстройка продолжает работать, но пассивно, она не делает активно ничего, кроме прослушивания событий, к которым она подключена, а затем реагирует, когда Inventor выполняет одно из событий, которое она слушает.Например, она будет реагировать на событие commandCreated, которая уведомляет надстройку, что один из его надстройки была выполнена пользователем.

Код - Python: [Выделить]
  1. def run(context):
  2.  ui = None
  3.  try:
  4.  app = adsk.core.Application.get()
  5.  ui = app.userInterface
  6.  ui.messageBox('Привет от надстройки!')
  7.  except:
  8.  if ui:
  9.   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
  10.  def stop(context):
  11.  ui = None
  12.  try:
  13.  app = adsk.core.Application.get()
  14.  ui = app.userInterface
  15.  ui.messageBox('Надстройка остановлена')
  16.  except:
  17.  if ui:
  18.   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Функцию "стоп" Fusion вызывает, когда надстройка остановлена.Это может быть по причине того, что пользователь остановил её с помощью диалога "Scripts and Add-Ins" или что более типично - по причине завершения работы Fusion и остановки всехнадстроек.Функция остановки - это место, где надстройка может выполнять любую необходимую очистку, такую как удаление любых элементов пользовательского интерфейса, которые были созданы.

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

run

Имя

Значение

Описание

IsApplicationStartup

ИСТИНА ИЛИ ЛОЖЬ

Указывает, была ли надстройка запущена во время автоматической загрузки при запуске Fusion (ИСТИНА) или загружается пользователем через диалоговое окно "Scripts and Add-Ins" (ЛОЖЬ).

stop

Имя

Значение

Описание

IsApplicationClosing

ИСТИНА ИЛИ ЛОЖЬ

Указывает, была ли надстройка остановлена во время завершения Fusion (ИСТИНА) или завершена пользователем через диалоговое окно "Scripts and Add-Ins" (ЛОЖЬ).

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

Вторая область API, которая является более полезной для надстроек - это команды. Это описано в теме Пользовательский интерфейс Fusion.

Отладка надстроек

Отладка надстроек JavaScript не отличается, от отладки сценариев JavaScript. Вы используете опцию "Debug" из диалога "Scripts and Add-Ins", и он будет автоматически останавливать операторе отладки, затем вы можете установить точки останова там, где вы хотите, и он будет вести себя так, как ожидается. Для этого выпуска, отладка надстройки Python не так проста, но это будет исправлено в следующем выпуске.

В настоящее время, при отладке надстройки на Python поведение при выполнении отличается от поведения при отладке. При отладке Python, надстройки Fusion не вызывает запуска надстройки или остановку функций, как это происходит, когда надстройка работает.Для отладки вашей надстройки Python, вам нужно временно изменить надстройки, чтобы заставить функцию запуска вызываться путем добавлением вызовов в функции.Функция выполнения имеет один контекстный аргумент, так что вам нет необходимости/0} передать что-то.Если вы не используете этот аргумент, это может быть что угодно, но если вы используете его в вашей функции запуска, вы должны передать что-то имеющее смысл, так чтобы вы могли полностью протестировать поведение.Вызов функции запуска может быть сделан путем вызова её из основного уровня вашей программы.Существует также проблема с Python при отладке событий, которые также рассмотрены в предстоящем выпуске.Работа по отладке событий обсуждается в теме про Связанные с Python вопросы .Это все показано в коде ниже надстройки Python, которая была модифицирована, чтобы позволить выполнить отладку, здесь дополнительный код подсвечивается красным цветом.

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

Источник: http://help.autodesk.com/cloudhelp/ENU/Fusion-360-API/files/AddInOverview.htm

 

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

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

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