Fusion360アドインの作り方01:アドインの作り方とテンプレートの構造

はじめに

 Fusion360のアドインの作り方を調査したので解説していきます。Fusion360では、pythonまたはC++で自作したコマンドを実行することができます。いわゆるマクロの実行のようなものです。
 コマンドの種類は2種類あって、スクリプトとアドインがあります。スクリプトは1度だけ実行する機能です。対して、アドインはアプリケーションに常駐し何度でもコマンドを発行することができます。これから何回かにわけて、アドインの作り方を説明していきます。以前のアドインは作り辛く、スクリプトの方が楽だったのですが、最近テンプレートが変わったようで、だいぶ作りやすくなっていました。そのため、個人的にはスクリプトではなくアドインの方が作りやすい気がします。

アドインの作り方

 では、Fusion360でのアドインの作り方を説明していきます。今回は、勉強のための色々なコマンドを格納した一つのアドイン「AddinStudy」を作りたいと思います。
 まずは、メニューバーで「ユーティリティ」を選び、「アドイン」リボンの「スクリプトとアドイン」を選択します。

 下のようなダイアログが出てくるので、アドインタブに切り替えます。既にアドインを作っている場合は、ここで該当のアドインを選択して「編集」をクリックすると、VisualStudioCodeが立ち上がって該当のフォルダが開かれます。事前にVisualStudioCodeはインストールしておいてください。
 なお、「実行」と「停止」でアドインを実行したり停止したりできます。実行中のアドインは名前の右側に円環が表示されます。
 今回はここで、「作成」をクリックします。そうすると、設定を行うダイアログが表示されます。

 ダイアログで、「新規作成」はアドインを選択し、「プログラミング言語」はPythonを、「スクリプト名またはアドイン名」には名称(今回はAddinStudy)を、「説明」には説明(コードで後から編集可能)を、作成者、バージョン等を指定して、「作成」を押してください。
 なお、「起動時に実行」のチェックボックスは、これを入れておくと起動時に勝手に立ち上がるようになるのですが、後からでも設定できるため、今はチェックしておかないことをお勧めいたします。

テンプレート

テンプレートの構造

 デフォルトで作られるテンプレートの構造はこのようになっています。ルートに「commands」と「lib」というフォルダが2つと、「.env」「AddinStudy.manifest」「AddinStudy.py」「config.py」の4つのファイルができています。
 また「commands」には、あらかじめ「commandDialog」と「paletteSend」と「paletteShow」の3種類のコマンドがプリセットされています。これらを見て、動作を学ぶのがよいと思います。
 「commandDialog」が主に作る新規コマンドのテンプレートになります。そのため、まずはこれを集中的に解説していきます。なお、「paletteSend」と「paletteShow」は2つ合わせて動作するもので、「paletteShow」で自分用のパレットを表示して、そのパレットに対して「paletteSend」で入力するような動きをするようです。ユースケースがよくわかりませんが、テンプレートを見るとWEBアプリとの連動とかができそうな気配です。

.envとAddinStudy.manifest

 これら2つのファイルはアドインの構造等を定義しているファイルだと思います。よくわかっていませんが、触らない方がよいかと思います。
 manifestの方には、「author」と「version」と「description」を設定する場所があります。これらで作成者、バージョン、説明を編集することができます。

AddinStudy.py

 このファイルはアドインの入り口です。中には「run」と「stop」の2つの関数が入っています。基本的に触らないでいいです。

config.py

 このファイルでは、「COMPANY_NAME」を設定する箇所があります。後は変更しないでよいと思います。「DEBUG=True」があることから、恐らくオンラインデバッグできるのかと思いますが、やったことありません。やり方わかったらまた別途報告いたします。

lib/event_utils.py

 コマンドが発行するハンドラの処理に関するユーティリティがまとまっています。触らないでいいです。

lib/general_utils.py

 ログやエラーイベントを出力する機能等が入っています。ここも、触らないでいいです。

commands/init.py

 ここは重要です。各コマンドの入り口になります。「start」と「stop」の関数があり、登録されているコマンドを自動で起動・終了してくれる構造になっています。

# Here you define the commands that will be added to your add-in.

# TODO Import the modules corresponding to the commands you created.
# If you want to add an additional command, duplicate one of the existing directories and import it here.
# You need to use aliases (import "entry" as "my_module") assuming you have the default module named "entry".
from .commandDialog import entry as commandDialog
from .paletteShow import entry as paletteShow
from .paletteSend import entry as paletteSend

# TODO add your imported modules to this list.
# Fusion will automatically call the start() and stop() functions.
commands = [
    commandDialog,
    paletteShow,
    paletteSend
]

 importの箇所で新規に追加するコマンドへのディレクトリのパスをエイリアス付きで通し、commandsのリストにそのエイリアスを追加します。これで、追加したコマンドがアドインの起動時に有効になるようになっています。

commandDialogの構造

 続いて、肝心の「commandDialog」に関して説明します。基本的にアドインの開発ではここだけ編集します。新規にコマンドを作る際は、このフォルダを丸ごと「commands」下にコピーして作成すればいいです。

resourcesフォルダ

 このフォルダにコマンドで使用するアイコンとか画像とかを登録します。アイコンは16x16、32x32、64x64のサイズが必要なようです。なお、AutodeskのAppStoreの登録には120x120のサイズのアイコンが必要になります。

entry.py

 コマンドを作りこむ部分です。実質的にここが全てです。他は触らないでいいです!
 なかには、次の関数がプリセットされています。

  • start:コマンド起動

  • stop:コマンド停止

  • command_created:コマンド起動時の処理

  • command_execute:コマンド実行処理

  • command_preview:(おそらく)コマンド実行前処理

  • command_input_changed:(おそらく)ダイアログ内での値変更時処理

  • command_validate_input:(おそらく)定期的な画面更新時の処理

  • command_destroy:(おそらく)コマンド終了前処理

 「(おそらく)」がついているのはどのタイミングで呼ばれているか私もよくわかっていません。名前と挙動から推察した結果です。
 なお、随所にある次の関数でFusion360のテキストコマンドエリアにログを吐き出すことができます。恥ずかしながら、まだデバッグ方法がわかっていない(調査・テストしていない)のでこれでprintfデバッグしています。

futil.log(f'{CMD_NAME} Command Created Event')

 「command_created」の次の処理でダイアログ内のコントロールを追加しています。「inputs」に適宜追加していけばよい構造です。この作りが非常に明確でわかりいいです。

inputs = args.command.commandInputs
inputs.addTextBoxCommandInput('text_box', 'Some Text', 'Enter some text.', 1, False)

 しかも、コマンド内の各所でコントロールを参照する際も次の処理でできます。「inputs」を他の関数でも適宜とってこれるのがよいです。以前アドイン作成した際は全てグローバル変数として確保していてわかり辛い構造になってしまいました・・・。

inputs = args.command.commandInputs
text_box: adsk.core.TextBoxCommandInput = inputs.itemById('text_box')
text = text_box.text

 どんなコントロールがあるのか、とか諸注意はまた別の記事でまとめたいと思います。
 「command_created」では、各関数をイベントハンドラに登録とかもしていますが、触らないでいいです。
 「command_execute」に実際のコマンドの実行処理を記述します。ここで、上述した「inputs」から各コントロールを参照することになると思います。
 なお、テンプレートでは、「command_input_changed」で値の適正判断をするのではなく、「command_validate_input」で値の適正判断をしています。適正判断の結果を受けて、ダイアログの「OK」を押せなくしたりすることもできるようです。

 では、今回はこのくらいにしたいと思います。

この記事が気に入ったらサポートをしてみませんか?