【DaVinci Resolve API】アプリ起動時にスクリプトを自動実行する方法
まえがき
初めましての人は初めまして。火注ゆかなです。
主に DaVinci Resolve のスクリプト関連の投稿をしています。
今までは note に記事を投稿してきましたが、今回から Zenn に投稿していきます。
スクラップを使えばソースコードを含む長いやり取りもできますし、コードは言語の種類も指定できますし。あと、まあ、ちょっと note に対する心象が悪くなったので。
note の過去記事もそのうち Zenn に移行する予定です。複数のサイトにバラついてると検索性がよくありませんし。
さて、今回の内容はタイトルの通りです。
DaVinci Resoveを起動した時、初期設定的なものをしたり、DaVinci Resolve と連携させるアプリを一緒に立ち上げる場合なんかに役立つでしょう。
連携アプリを一々個別に起動させるの、面倒ですよね?
一度設定しておけば DaVinci Resolve を起動するだけでまとめて立ち上がってくれますよ。
え? シェルやらバッチファイルやら PowerShell やらでまとめて起動すれば良い?
それはそう。
scriptlibファイルで起動時の自動実行を行う
今回の内容については主に VFXPedia を参考にしています。
( eyeon software 時代の情報なので現状と異なる部分もあります)
scriptlibファイルとは?
scriptlib
ファイルは拡張子が違うだけで、中身は Lua ファイルです。
ちょっと注意点はありますが、DaVinci Resolve で動く Lua スクリプトはそのまま動きます。
なので、テストの時は.lua
拡張子にしておけば GUI 上で動かして動作確認できますし、テストが終わったら.scriptlib
拡張子にリネームすれば良いでしょう。
楽ですね。
ちなみに scriptlib ではコンソールから実行するときと同様にresolve
とfusion
の2つの変数が初期設定済みです。
ファイルの置き場所
起動時のスクリプトの自動実行は.scriptlib
という拡張子のファイルを下記のパスマップフォルダの下に置けば実行されます。
Scripts:
-
Scripts:Utility/
←こちらを推奨
該当するパスマップフォルダは「Fusion 設定」の「パスマップ」から右クリックすると確認できる
「パスマップとかよくわからんわー」と、どこに置けば良いかわからない人は以下のフォルダに置いてください。
C:\ProgramData\Blackmagic Design\DaVinci Resolve\Fusion\Scripts\Utility\
これでアプリの起動時に読み込まれて実行されます。
Pythonで記述したい場合
機能面やデバッグ効率の関係から、スクリプトを Python で記述している人も多いかと思います。 Lua ができることは API に依るところが大きいので……。
scriptlib ファイルは Python では記述できません。
でも簡単なコードならfusion:Execute(command)
で実行できますし、複雑なコードもfusion:Runscript(filepath)
で Python ファイルを呼び出して実行できます。
fusion:Execute()
で scriptlib 内に直に書き込む場合、"!Py3: "
という風に言語指定する必要がある点に注意してください。
# 呼び出されるPythonファイル
print("Hello Python World!")
print(fusion)
print(resolve)
print(resolve.GetProjectManager().GetCurrentProject().GetName())
print("Scliptlib Test from Utility Folder")
-- Pythonを実行したい場合、簡単なものならfusion:Execute()で実行, 複雑なものはfusion:Runscript(filepath)で呼び出すことを推奨
fusion:Execute([[!Py3: print("Python Execute Test")]]) -- 冒頭に「!Py3: 」と付けて言語指定
fusion:RunScript([[C:\ProgramData\Blackmagic Design\DaVinci Resolve\Fusion\Scripts\Tool\py_test.py]])
実行結果
scriptlib を手動で呼び出す方法
scriptlib ファイルは起動時に自動実行するためのものですが、同じような処理を手動で実行したい状況もあるかと思います。
こういう状況では Lua ファイルや Python ファイルならfusion.RunScript(filepath)
を使うのですが、scriptlib は拡張子が異なるためか実行できません。(特にエラーが出るわけではない)
Lua スクリプトから scriptlib を実行したい場合、下記のコマンドを使います。
-
ldofile(filepath)
(頭文字は「小文字のL」。「Library dofile」の略?) dofile(filepath)
We Suck Less フォーラムでは ldofile()
を使っている人もいますが、一応 dofile()
でも動くことを確認しました。昔は ldofile()
でしか動かなかったんですかね?
今はどちらでも良さそうですが、こだわりがないなら ldofile()
の方が良いかも?
一方で ldofile()
がない Python から scriptlib ファイルを実行するにはどうすれば良いかというと、fusion.Execute(command)
で Lua コマンドを介せば実行できます。
# fusion.Execute()でLuaコマンドを介することで、Pythonからscriptlibを手動実行する
filepath = r'C:\ProgramData\Blackmagic Design\DaVinci Resolve\Fusion\Scripts\Utility\test.scriptlib'
fusion.Execute(f'ldofile([[{filepath}]])')
注意点
カレントプロジェクトを取得しようとすると空のプロジェクトを返す
scriptlib でカレントプロジェクトを取得しようとすると、一応は成功します。
ただし、返されるのは空のプロジェクトのようで、プロジェクト名を表示するとUntitled Project
が返ってきます。
一番下の行がカレントプロジェクト名の取得結果
カレントプロジェクトを取得して云々〜みたいなコードを実行させたい場合は注意が必要です。
scriptlib の実行タイミングはプロジェクトマネージャーが表示されたあたり、と考えた方が良さそうですね。
プロジェクトマネージャー画面が表示された前後のタイミングで実行されてる?
変数の初期設定方法
scriptlib で変数に値を設定しても、コンソールや他のスクリプトから参照することはできません。
print("Scliptlib Test from Utility Folder")
test = 10 -- ここで変数に代入しても、コンソールなどから参照はできない
print(test)
を実行しても nil が返却される
もし、どうしても初期設定しておきたい場合はfusion:SetData(key, value)
で保存しておけます。
保存したデータはfusion:GetData(key)
で取得できます。
ちなみにfusion:SetData()
で指定するキーを「.(半角ドット)」で区切ると、連想配列として入れ子構造になります。
print("Scliptlib Test from Utility Folder")
fusion:SetData("test", 10)
fusion.SetData("Test.Python.Value", "SetDataテストです") -- キーを「.」で区切ると連想配列の入れ子構造になる
-- fusion:SetData("Test.Python.Value") -- 第2引数を省略するか、nilを渡すと該当データを削除可能(今回は実施しない)
fusion:SetData(key, value)
で保存したデータをfusion:GetData(key)
で取り出した結果
削除したい場合はfusion:SetData()
の第2引数を省略するか、第2引数にnil(PythonならNone)
を渡して実行してください。
なお、SetData() で保存できるのは真偽値、数値、文字列、テーブル( Python なら list 、dic )など、基本的な型だけです。
関数やインスタンスなどを保存してしまうと取り出せないだけでなく、 GetData() が上手く機能しない場合があります。
誤って関数などを設定してしまった場合は上記手順で削除すると解決するはずです。
あとがき
これにてアプリ起動時にスクリプトを自動実行する方法についての説明は以上となります。
使い道は色々とあるんじゃないでしょうか。私が思いつくのは連携アプリの同時立ち上げや、フォルダなどを監視するぐらいですが。
ちなみに VFXPedia のページではAddEventSuite("Composition")
でFusionのいくつかのイベントを検知できると書いていますが、現状だとこの方法でイベントトリガーの設定はできないようです。
実行すると定義されていないというエラーが出ます。
fu ファイルでのアクショントリガー設定などができることは確認済みなので、そちらの方法は後日改めて記事にする予定です。
それでは、この記事が皆様のお役に立てば幸いです。
Discussion