APIで作成したダイアログボックスを[ok]選択後に消す方法を知りたい

APIで作成したダイアログボックスを[ok]選択後に消す方法を知りたい

MM0501
Participant Participant
1,392件の閲覧回数
7件の返信
メッセージ1/8

APIで作成したダイアログボックスを[ok]選択後に消す方法を知りたい

MM0501
Participant
Participant

お世話になっております.

私は,fusionのapiをここ2年程触っている者です.

 

現在,コマンドを用いてドロップダウン式に選択を行う,ダイアログボックスの作成を行っております.

選択やその結果の他プログラムへの受け渡しなどは問題ないのですが,

[ok]を押したのにも関わらず,その後の処理の間もずっと選択に用いたダイアログボックスが表示されています.

(以下が該当のダイアログボックスです.名称が異なっていたら申し訳ありません.)

スクリーンショット 2025-07-22 170446.png

 

下のコードは,ダイアログが閉じた際のイベントハンドラーです.

 

class _StockDimDestroyHandler(adsk.core.CommandEventHandler):
    def notify(self, args):
        # ダイアログが閉じられた際の処理
        # キャンセルが押された場合 (execute イベントが発生しない) は、
        # スクリプトプロセスが残り続けないように終了する。
        command = args.command

        cmdDef = ui.commandDefinitions.itemById('getStockDimensionsCmd')
        Bool = cmdDef.deleteMe()
        if Bool:
            ui.messageBox("消せた")
        else:
            ui.messageBox("消せなかった")


        global cancelled
        # ダイアログが閉じられた際の処理
        if args.terminationReason == adsk.core.CommandTerminationReason.CompletedTerminationReason:
            ui.messageBox('OKボタンが押されました。')
            run_next_command()
        elif args.terminationReason == adsk.core.CommandTerminationReason.CancelledTerminationReason:
            ui.messageBox('キャンセルボタンが押されました。')
            cancelled = True
            run_next_command()

 

上記のように,deleteMe()を用いて消去やドロップダウンの非表示などを行いましたが,解決に至っていません.
特に,deleteMe()の場合,"消せた"と表示されることから,処理上はダイアログボックスが消去されたものと認識しています.


現在は,uiへの反映が遅れていることを軸に検討を進めております.

方法をご存知の方がいましたら,教えていただけますと幸いです.

0 件のいいね
1,393件の閲覧回数
7件の返信
返信 (7)
メッセージ2/8

kandennti
Mentor
Mentor

@MM0501 さん こんにちは

少し確認したいのですが、ダイアログは2個表示するようなスクリプト(アドイン?)なのでしょうか?

0 件のいいね
メッセージ3/8

kandennti
Mentor
Mentor

簡単なスクリプトを作成しました(添付しました)が、OKボタンを押した際にダイアログが消えない現象の再現が出来ませんでした。

・OKボタンを押した際に発火するのはexecuteイベントですが、こちらを利用しなくてもOKボタンを押すとダイアログが消えました。
https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-4fbdc9ad-1dd4-4dca-bdf1-0000cbfe10d9 

・記載されているのはdestroyイベントかと思われますが、destroyイベントを利用しなくてもダイアログは消えました。
https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-49fa3e45-a488-463b-aa13-94541ad6c0cd 

0 件のいいね
メッセージ4/8

MM0501
Participant
Participant

@kandennti さん

 

メッセージをいただきありがとうございます.

今回のスクリプトでは,ダイアログは1回のみ表示します.

また,当該現象の発生するスクリプトを作成の上,添付しました.

ご確認いただけますと幸いです.

0 件のいいね
メッセージ5/8

kandennti
Mentor
Mentor

@MM0501 さん ありがとうございます。

結論から先に書くと、自分の方ではOKボタンを押すとダイアログが消えました。

(マイ ビデオを表示)

原因は・・・ちょっとわからないですね。
自分が添付したものや他のスクリプトでも、OKボタンを押しても同じ現象が出るのでしょうか?

ひょっとしたらインストール状態が良くないのかもしれません。
・Fusion360を再起動して再度実行。
・新たなスクリプトを作成して、中身をコピペして実行。
・PCも再起動して再度実行。

それで効果が無い場合は、キャッシュのクリアやサービスユーティリティの復旧と言ったところでしょうか?

(設定等が消えるのでご注意を)

kandennti_0-1753227463457.png

 

メッセージ6/8

MM0501
Participant
Participant

@kandennti  さん

 

確認ありがとうございます.

動画を確認したところ,私と同様の画面です.

 

伝え方が間違っていた様で申し訳ないです.

私が気になっている点は,[ok]を押した際に,メッセージボックスが表示される前にダイアログが消えないのか という点です.

 

プログラムでstep_finalize関数に入ると,

ダイアログを表示させていたstep_initialize関数は終了するので,ダイアログは消えると思うのですが...

 

 

0 件のいいね
メッセージ7/8

kandennti
Mentor
Mentor

@MM0501 さん

意味がやっと分かりました。
厳密にはわからないのですが、executeするとCommandDefinitionがダイアログそのもののような気がしてます。

試しに以下の様に修正しました。

・
・
・
def step_finalize():
    sum_value = value1_mm + value2_mm
    ui.messageBox(str(sum_value))

    isCommandEnabled("terminate前:")

    adsk.terminate()

    isCommandEnabled("terminate後:")


def isCommandEnabled(header: str = ""):
    '''
    コマンドの有効無効チェック
    '''
    cmdDef = ui.commandDefinitions.itemById('getStockDimensionsCmd')
    if cmdDef:
        app.log(f"{header}コマンド有り")
    else:
        app.log(f"{header}コマンド無し")
・
・
・
step_initializeはdestroyイベント後に実行されていましたが、実際の結果はCommandDefinitionは生きていました。
adsk.terminateで完全に削除されると思っていましたが、違いました
 terminate前:コマンド有り
 terminate後:コマンド有り


この辺りの仕組みは我々では知ることが出来ませんし、変更されることも無いだろうと思っています。


コードを見る限り、恐らく複数の処理を続けて行えるようなものを作成しようとしているのだろうと感じています。
(処理Aを行ってOkボタン後に処理B->処理C・・・の様に)
上記の現象を考えると、システムの都合上今のやり方では出来ないものと割り切った方が解決しそうな気がしています。
代案としては

・全ての処理を一個のコマンドにする(ExecutePreviewイベントを活用する)
・それぞれを別スクリプトとして処理する
 ->こちらのアドインを利用してもらうとスクリプトの呼び出しが少し楽になります。
  https://github.com/kantoku-code/Fusion360_ScriptLauncher 
・アドインを作成しメニュー部分のタブを自作し、実行させるボタンを順番に並べる。
等が考えられます。

分からない部分があればその都度質問してみてください。

メッセージ8/8

MM0501
Participant
Participant

@kandennti  さん

 

複数の解決策を提示いただき,ありがとうございます.

色々な機能があるので,何かあるのではと思っていましたが,かなり難しいようですね.

 

参考にさせていただきます.