Open1

DaVinci Resolveマクロ--Expression内でのローカル宣言についてのメモ

セカイルセカイル

初スクラップです


Expression内でのlocal宣言が有効であるか

Expressionの記述欄は1行です。
単純なパラメータの参照や式を記述する事を想定しているのだと思います。
if文もiif()という形で1行で記述するようになっています。
一方で先頭に:を付ける事によってレンダースクリプトと同様に複数行でLua風の記述がサポートされているようです。
なので、if...then...else...end といった普通のif文を記述する事も出来ます。
但し、レンダースクリプトではifの評価がfalseであった場合に何もしないという事が出来るのに対してExpressionでは必ず何かをreturnする必要があるように思います。
そもそもExpressionはローカルのような環境で実行されていると思うので、敢えてlocal宣言をする必要は無いかもしれません。また、Expression内でのlocal宣言は動作が保証されていなかったり、非推奨の可能性もあると思いました。
そこで、今回はExpression内でのlocal宣言が有効なのかを簡単に検証してみました。
結論から言うと少なくとも現時点では無効では無いと判断しました。

検証内容

  • 任意のノードに新しくユーザーコントロールID:testParamを追加
  • testParamNumber型、ディフォルト値0.0、コントロールのタイプはSliderControl
    1. testParmExpressionに以下のように記述
:
local testFlag = true
if testFlag then
    local testValue = 1
end
return testValue

結果はtestParamはディフォルト値の0.0から変化せず。

予想としては値がnilになってエラーを起こすと思っていましたが、コンソールを見ても特にエラーは出ていません。また、コンポジションが停止する等と言った事もありませんでした。


  1. 次にローカル宣言をしなかった場合も検証してみました。testParmExpressionに以下のように記述
:
local testFlag = true
if testFlag then
    testValue = 1
end
return testValue

結果はtestParamの値が1.0に変化しました。

以上2つの検証結果から

  • ifブロック内でlocal宣言した変数はifブロック外からの参照はできなかった。
  • ifブロック内でlocal宣言しなかった変数はifブロック外からの参照ができた。(このExpression内で共有可能な変数だと思います。)

有効だけど不可解な点も

なのでExpression内でのローカル宣言は有効だと思います。
エラーにならなかった原因はよく分かりません。
また、このノードの他のパラメータからは参照可能なのかについては未検証です。
必要があればもう少し深掘りしてみるかもしれません。