C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

2022版 Fusion360 Pythonアドインテンプレートの入り口2

こちらの続きです。
2022版 Fusion360 Pythonアドインテンプレートの入り口1 - C#ATIA

今回は現在のアドインテンプレートのお話を進めていきます。

ファイル構成

新作したアドインのファイル構成はこんな感じになっていました。

OreAddIn
│  .env
│  config.py
│  OreAddIn.manifest
│  OreAddIn.py
│  
├─.vscode
│      launch.json
│      settings.json
│      
├─commands
│  │  __init__.py
│  │  
│  ├─commandDialog
│  │  │  entry.py
│  │  │  __init__.py
│  │  │  
│  │  └─resources
│  │          16x16.png
│  │          32x32.png
│  │          64x64.png
│  │          
│  ├─paletteSend
│  │  │  entry.py
│  │  │  __init__.py
│  │  │  
│  │  └─resources
│  │          16x16.png
│  │          32x32.png
│  │          64x64.png
│  │          
│  └─paletteShow
│      │  entry.py
│      │  __init__.py
│      │  
│      └─resources
│          │  16x16.png
│          │  32x32.png
│          │  64x64.png
│          │  
│          └─html
│              │  index.html
│              │  
│              └─static
│                      palette.js
│                      
└─lib
    └─fusion360utils
            event_utils.py
            general_utils.py
            __init__.py

実際に重要なのは
・config.py
・commands\__init__.py
・commandsフォルダ内のフォルダ
の2ファイルと1フォルダとその内部のファイルです。
基本的に他は修正の必要は無いはずです。

"config.py"について

中身はこんな感じです。(コメント部は翻訳サイトで訳しました)

# アプリケーションのグローバル変数
# このモジュールは、異なる環境間で変数を共有する方法として機能します
# モジュール (グローバル変数)。
import os

# デバッグ モードで実行するかどうかを示すフラグ。 デバッグモードで実行する場合
# 詳細情報がテキスト コマンド ウィンドウに書き込まれます。 一般的に、それは有用です
# アドインの開発中はこれを True に設定し、開発中は False に設定します。
# 配布準備中です。
DEBUG = True

# py ファイルがあるフォルダーの名前からアドインの名前を取得します。
# これは、さまざまな UI 要素に固有の内部名を定義するときに使用されます
# 一意の名前が必要です。 会社名を使用することもお勧めします。
# ID が一意であることをより確実にするための ID の一部。
ADDIN_NAME = os.path.basename(os.path.dirname(__file__))
COMPANY_NAME = 'ACME'

# パレット
sample_palette_id = f'{COMPANY_NAME}_{ADDIN_NAME}_palette_id'

基本的に複数の自作コマンドを追加することを想定されており、全てのコマンドで
利用される変数(定数的なものを想定していると思います)は、このファイル内で
宣言・初期化しておくようです。

記述と順番が違いますが、重要なのは”COMPANY_NAME”です。
ここは必ず書き換えるべきです。コマンドのIDがバッティングしてしまうと
(確か・・・)後から読み込まれたアドインのコマンドIDが有効となり
他のアドインに影響を与える可能性が有ります。
その為、ユニークな文字を代入しておく必要があります。
と言っても、実際のコマンドを作成するファイル側でルールに
基づいて記述必要があります。
(歯切れが悪い・・・)

僕の場合は

COMPANY_NAME = 'KANTOKU'

としているので、他の方は使わないでね~。

"DEBUG"については、開発時はTrueでリリース時にはFalseにします。
デバッグ時にちょっとした出力で確認したい際

app.log('hoge')

で行いますが、リリース時にデバッグ用の出力が表示されてしまうのは不都合な
場合が多いです。その為に全ての出力を書き換えたりするのが非常に手間なのですが、

from ...lib import fusion360utils as futil
futil.log('hoge')

としておくことで、"DEBUG = True"の時のみ出力するようになります。

"sample_palette_id"は、テンプレートにパレットを使用したものが入っている為、
利用されていますが、通常のダイアログしか使用しない場合は不要なので
削除してしまっても構わないです。(そのままでもOKです)

"commands\__init__.py"について

"__init__.py”が、あちこちにあるので紛らわしいのですが、”commands"フォルダ内の
"__init__.py”のお話です。

”そもそも__init__.pyって何なの? しかも中身が空の物まで在りやがる”と思う方は
こちらをご覧ください。
Python の __init__.py とは何なのか - Qiita


中身はこんな感じです。(コメント部は翻訳サイトで訳しました)

# ここで、アドインに追加されるコマンドを定義します。

# TODO 作成したコマンドに対応するモジュールをインポートします。
# コマンドを追加する場合は、既存のディレクトリの 1 つを複製し、ここにインポートします。
# 「entry」という名前のデフォルトモジュールがあると仮定して、
# エイリアスを使用する必要があります (「entry」を「my_module」としてインポート)。
from .commandDialog import entry as commandDialog
from .paletteShow import entry as paletteShow
from .paletteSend import entry as paletteSend

# TODO インポートしたモジュールをこのリストに追加します。
# Fusion は自動的に start() および stop() 関数を呼び出します。
commands = [
    commandDialog,
    paletteShow,
    paletteSend
]


# 各モジュールで「start」関数を定義したと仮定します。
# アドインの起動時にstart関数が実行されます。
def start():
    for command in commands:
        command.start()


# 各モジュールで「stop」関数を定義したと仮定します。
# アドインが停止するとstop関数が実行されます。
def stop():
    for command in commands:
        command.stop()

アドインテンプレートでは自作のコマンドはパッケージ(モジュール?)
として読み込み、実行しています。
その為、

from <commandsフォルダ内のフォルダ名> import <コマンドのエントリポイントとなるファイル名> as <インポート後の名前>

と記述してインポートしています。

その後、"commands"変数(リスト)に代入しており、リスト内のモジュールが
実行・停止がされるような仕組みを採用しています。
逆に、一時的にリリースを止めたいコマンドがある場合は、"commands"変数に
モジュールの追加を止めるだけでコマンドは追加されません。

"commandsフォルダ内のフォルダ"について

自作コマンドを作成する際にはここで作業することになります。

通常のダイアログを使用している"commands\commandDialog"を見てみます。
ファイル構成はこの様になっています。

commandDialog
 │  entry.py
 │  __init__.py
 │  
 └─resources
         16x16.png
         32x32.png
         64x64.png

・entry.py:実際に処理を記述している
・__init__.py:空っぽ(存在するだけでOKです)
・resourcesフォルダ:この中のファイルがメニューに表示されるアイコン
resourcesフォルダ内のファイル名は固定です。各サイズのpngファイルを用意する
必要があります。

結果的に"entry.py"が主に作業する必要がある事が分かります。
"entry.py"のファイル名は固定する必要はありませんが、前節の
「"commands\__init__.py"について」で記載したインポートを修正する
必要があります。
特別な理由が無い限り"entry.py"のままで良いと思います。



長くなったので"entry.py"の中身について次回に。
・・・コメントを日本語化したヤツは、そのうちgithubにupしようかな?