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
を追加 -
testParam
はNumber
型、ディフォルト値0.0
、コントロールのタイプはSliderControl
1.testParm
のExpression
に以下のように記述
:
local testFlag = true
if testFlag then
local testValue = 1
end
return testValue
結果はtestParam
はディフォルト値の0.0
から変化せず。
予想としては値がnil
になってエラーを起こすと思っていましたが、コンソールを見ても特にエラーは出ていません。また、コンポジションが停止する等と言った事もありませんでした。
- 次にローカル宣言をしなかった場合も検証してみました。
testParm
のExpression
に以下のように記述
:
local testFlag = true
if testFlag then
testValue = 1
end
return testValue
結果はtestParam
の値が1.0
に変化しました。
以上2つの検証結果から
-
if
ブロック内でlocal
宣言した変数はif
ブロック外からの参照はできなかった。 -
if
ブロック内でlocal
宣言しなかった変数はif
ブロック外からの参照ができた。(このExpression
内で共有可能な変数だと思います。)
有効だけど不可解な点も
なのでExpression
内でのローカル宣言は有効だと思います。
エラーにならなかった原因はよく分かりません。
また、このノードの他のパラメータからは参照可能なのかについては未検証です。
必要があればもう少し深掘りしてみるかもしれません。