C#ATIA

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

スクリプトから別のスクリプトを呼び出したい

以前からスクリプトから別のスクリプトを呼び出せないかな? と思っていたので
試してみました。

まず、新規のスクリプトを2個作ります。
f:id:kandennti:20211118165120p:plain
名前はデフォルトのままで、NewScript1とNewScript2です。
この状態でNewScript2からNewScript1を実行することをゴールとします。

念の為、フォルダ/ファイルの階層はこんな感じです。

Scripts/
├── NewScript1
│   ├── NewScript1.manifest
│   └── NewScript1.py
└── NewScript2
    ├── NewScript2.manifest
    └── NewScript2.py

NewScript1側は特に変更せずにします。
単体で呼び出せば "Hello script" が表示されます。
f:id:kandennti:20211118165231p:plain
成功すればこれと同じ結果ですね。

NewScript2側はNewScript1を読み込んで実行すればOKなので
sys.pathにパスを追加してインポートします。こんな感じです。

# Fusion360API Python script
import adsk.core
import adsk.fusion
import traceback
import sys
import pathlib

try:
    parent_dir = pathlib.Path(__file__).resolve().parent.parent
    target_dir = parent_dir / 'NewScript1'

    sys.path.append(str(target_dir))
    import NewScript1
except:
    pass
finally:
    # これはやった方が良い気がする
    del sys.path[-1]

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface

        NewScript1.run(context)

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

色々試したけど、これが一番安定している気がしました。
importの範囲がイマイチつかみ切れていないみたい・・・。