autodesk fusionで アドインを作成しようと考えていますが、 まず、新規add in作成直後の状態を確認してみます。
新規アドイン作成、スクリプト x アドインの違い
「ユーティリティ → アドイン → アドインタブ → 作成」により新規アドインが
c:/Users/end0t/AppData/Roaming/Autodesk/Autodesk Fusion 360/API/AddIns/
に作成されます。
スクリプトは1回、実行されるだけですが、 アドインは実行すると、メニューバーにボタンアイコンが表示され、 ボタンをクリックすることで、複数回、実行できます。
デフォルトアドイン実行の様子
新規作成したアドインを選択し、実行をクリックすると、 メニューバーにボタンアイコンが表示され、これをクリックすることで実行されます。
デフォルトアドインは、ユーザ入力のダイアログを表示し、 ユーザの入力結果をメッセージボックスへ表示します。
デフォルトアドインのdir構成
c:/Users/end0t/AppData/Roaming/Autodesk/Autodesk Fusion 360/API/AddIns/NewAddIn1/
├ AddInIcon.svg #【※0】このまま
├ config.py # 〃
├ NewAddIn1.manifest # 〃
├ NewAddIn1.py # 〃
├ .vscode/launch.json # 〃
├ lib/fusionAddInUtils/# 〃
│ ├ __init__.py # 〃
│ ├ event_utils.py # 〃
│ └ general_utils.py # 〃
└ commands/
├ __init__.py # 【※2-2】2-1の削除に伴い、修正
├ commandDialog/ #【※1】修正
│ ├ __init__.py # 〃
│ ├ entry.py # 〃
│ └ resources/6x16.png, 32x32.png, 64x64.png # 〃
├ paletteSend/ #【※2-1】削除
│ ├ entry.py # 〃
│ └ resources/6x16.png, 32x32.png, 64x64.png # 〃
└ paletteShow/ # 〃
├ entry.py # 〃
└ resources/ # 〃
├ 6x16.png, 32x32.png, 64x64.png # 〃
└ html/
├ index.html
└ static/palette.js
【※0】 変更せず、このままでも問題ないようです
【※1】 アドインでの具体的な処理で、詳細は後述します
【※2-1】 paletteSend/, paletteShow/ は、html+jsによるweb uiパレットとpython間で 連携する為のもののようですが、使用しない為、削除して構いません
【※2-2】 paletteSend/, paletteShow/ は、init.py から呼ばれますので、 以下のようにコメントアウトします。
from .commandDialog import entry as commandDialog #from .paletteShow import entry as paletteShow ## ★ #from .paletteSend import entry as paletteSend ## ★ commands = [ commandDialog, # paletteShow, ## ★ # paletteSend ## ★ ] def start(): for command in commands: command.start() def stop(): for command in commands: command.stop()
commands/commandDialog/entry.py
python src内のコメントを日本語化しています
import adsk.core import os from ...lib import fusionAddInUtils as futil from ... import config app = adsk.core.Application.get() ui = app.userInterface # TODO *** Specify the command identity information. *** CMD_ID = f'{config.COMPANY_NAME}_{config.ADDIN_NAME}_cmdDialog' CMD_NAME = 'Command Dialog Sample' CMD_Description = 'A Fusion Add-in Command with a dialog' # パネルに表示 or not IS_PROMOTED = True # パネルへの表示位置 WORKSPACE_ID = 'FusionSolidEnvironment' PANEL_ID = 'SolidScriptsAddinsPanel' COMMAND_BESIDE_ID = 'ScriptsManagerCommand' # アイコンフォルダの位置 ICON_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'resources', '') # clickや起動処理等、イベントハンドラの保持リスト local_handlers = [] def start(): cmd_def = ui.commandDefinitions.addButtonDefinition(CMD_ID, CMD_NAME, CMD_Description, ICON_FOLDER) # ボタンクリック時に呼ばれるイベントハンドラー futil.add_handler(cmd_def.commandCreated, command_created) workspace = ui.workspaces.itemById(WORKSPACE_ID) panel = workspace.toolbarPanels.itemById(PANEL_ID) control = panel.controls.addCommand(cmd_def, COMMAND_BESIDE_ID, False) control.isPromoted = IS_PROMOTED def stop(): workspace = ui.workspaces.itemById(WORKSPACE_ID) panel = workspace.toolbarPanels.itemById(PANEL_ID) command_control = panel.controls.itemById(CMD_ID) command_definition = ui.commandDefinitions.itemById(CMD_ID) if command_control: command_control.deleteMe() if command_definition: command_definition.deleteMe() # click時に呼ばれるmethod def command_created(args: adsk.core.CommandCreatedEventArgs): # text command windowsへのログ出力 futil.log(f'{CMD_NAME} Command Created Event') # userの入力を受取るdialogの定義 inputs = args.command.commandInputs inputs.addTextBoxCommandInput('text_box', 'Some Text', 'Enter some text.', 1, False) # defaultの長さ単位. mm, cm, inch defaultLengthUnits = app.activeProduct.unitsManager.defaultLengthUnits default_value = adsk.core.ValueInput.createByString('1') inputs.addValueInput('value_input', 'Some Value', defaultLengthUnits, default_value) # 各イベントハンドラーの登録 futil.add_handler(args.command.execute, command_execute, local_handlers=local_handlers) futil.add_handler(args.command.inputChanged, command_input_changed, local_handlers=local_handlers) futil.add_handler(args.command.executePreview,command_preview, local_handlers=local_handlers) futil.add_handler(args.command.validateInputs,command_validate_input, local_handlers=local_handlers) futil.add_handler(args.command.destroy, command_destroy, local_handlers=local_handlers) def command_execute(args: adsk.core.CommandEventArgs): futil.log(f'{CMD_NAME} Command Execute Event') inputs = args.command.commandInputs text_box: adsk.core.TextBoxCommandInput = inputs.itemById('text_box') value_input: adsk.core.ValueCommandInput = inputs.itemById('value_input') text = text_box.text expression = value_input.expression msg = f'Your text: {text}<br>Your value: {expression}' ui.messageBox(msg) def command_preview(args: adsk.core.CommandEventArgs): futil.log(f'{CMD_NAME} Command Preview Event') inputs = args.command.commandInputs def command_input_changed(args: adsk.core.InputChangedEventArgs): changed_input = args.input inputs = args.inputs futil.log(f'{CMD_NAME} Input Changed Event fired from a change to {changed_input.id}') def command_validate_input(args: adsk.core.ValidateInputsEventArgs): futil.log(f'{CMD_NAME} Validate Input Event') inputs = args.inputs valueInput = inputs.itemById('value_input') if valueInput.value >= 0: args.areInputsValid = True else: args.areInputsValid = False def command_destroy(args: adsk.core.CommandEventArgs): futil.log(f'{CMD_NAME} Command Destroy Event') global local_handlers local_handlers = []