🎞️

DaVinci Resolveのsettingファイルの再編集(InstanceInput編)

に公開

InstanceInputの編集

マクロを書き出すとコントロールは元のノードのコントロール名では無く
Inputxx = InstanceInput {...}という形で書き出されます。
これがインスペクタに表示される項目なので、マクロのUI直接関係する所です。
それ故に書き出したsettingファイルをテキストエディタで編集する上で最も頻度が高い項目と言えるでしょう。
settingファイル内ではファイルの最序盤のInputs = oredered() {...}のブロック内に存在します。


DaVinci Resolve内では編集不可な項目

DaVinci Resolve付属のコントロールエディタやマクロ書き出し用のダイアログからでは編集不可な項目がいくつかあります。
また、編集は可能でも柔軟な対応が困難な項目もあります。以下にその主な例を挙げます。

  • コントロールの順番を入れ替えることができない
  • コントロールのIDを再編集、又は削除できない
  • 区切り線や空白などを追加することができない
  • ディフォルト値が丸められた数値になりにくい
  • ラベルコントロールの設定が困難

これらの項目は全てテキストエディタで再編集可能です。

InstanceInputの記述項目

記述項目とそれぞれが何を意味するかを理解しておくと編集作業もスムーズになります。
また、マクロ書き出し時にチェックし忘れていたとしても元のノードのノード名とコントロールIDさえ解れば以下のような形式で記述して差し込む事も可能です。
但し、元のノードに実在するコントロールでなくてはなりません。

Inputxx = InstanceInput {       -- xxの部分は番号(必須)
    SourceOp = "ノード名",       -- (必須)
    Source = "コントロールID",   -- (必須)
    Default = 0,                -- ディフォルト値
    Name = "表示名",
    Page = "ページ設定"
},                              -- カンマ忘れに注意

各項目をもう少し詳しく掘り下げます。

  • Inputxx
    • xxの部分はインスペクタの登場順(上から順番に1~)で自動的に割り当てられます。
    • 後に順番を入れ替えても番号が昇順で整列している必要はありません。欠番があっても問題ありません。
    • 任意の番号に書き換えが可能です。但し、重複に注意。
      重複する番号があった場合は先に登場した物が優先され以降重複する番号は無効となります。
  • SourceOp
    • コントロールが属しているノードの名前です。必須です。日本語は避けた方が無難です。
      (例)Text1,Merge1,Transform1...etc ユーザーが付けたノード名など
  • Source
    • コントロールのIDです。必須です。日本語は避けた方が無難です。
    • 属するノードが違う同名のIDが存在する可能性があります。
      (例)Center,Height,...etc コントロールエディタでユーザーが設定したIDなど
    • ユーザーが設定したIDはUserConrolsで再編集や削除が可能ですが、InstanceInputからは参照するのみで変更は出来ません。
  • Default
    • ディフォルト値です。必須ではありません。
    • 設定しなければコントロールのディフォルト値又はUserConrolsINP_Defaultが採用されます。
    • インスペクタ上でコントロール名をダブルクリックした時にはこの値が採用されます。
    • UserConrolsINP_Defaultを設定していてもこちらが優先されます。
    • コントロールの種類によって変わります。
      (例)Point型のコントロールではDefaultX,DefaultYなどとなります。
  • Name
    • インスペクタ上に表示されるコントロールの名前です。必須ではありません。日本語でも問題ありません。
    • 設定しなければ、ディフォルトの名前やUserConrolLINKS_Nameで設定した名前が採用されます。
    • ディフォルトの名前やUserConrolsLINKS_Nameで設定した名前があってもこちらが優先されます。
  • Page
    • インスペクタ上で表示されるページを設定します。必須ではありません。
    • 設定しなければ、ディフォルトのページやUserConrolICS_ControlPageで設定したページが採用されます。
    • ディフォルトのページやUserConrolsICS_ControlPageで設定したページがあってもこちらが優先されます。

その他最大値や最小値なども設定できますが、設定できる項目はコントロールの種類によって違います。

順番の入れ替え方

settingファイルのInputxx = InstanceInput {...}の並び順がそのままインスペクタに表示されるコントロールの並び順です。
Inputxx = InstanceInput {...}のブロックを選択して切り取り、貼り付け等で並び順を変更すると良いです。

入れ替え前

入れ替え後
また、上下を入れ替える等移動距離が少ない場合はVSCodeの機能を利用して移動したい
Inputxx = InstanceInput {...}のブロックがある行を選択した状態でAlt+アローキーの上下を押す事によって移動できるので便利です。

また、有志の方が作成した順番を入れ替えるツールも公開されていますので、そちらを利用するのも良いと思います。


区切り線や空白の挿入の仕方

  • 元のノードにある区切り線や空白を利用します。
  • BlankSeparatorが区切り線です。ApplyBlankだと空白です。
  • マクロ書き出しの際に書き出しておく必要はありませんが、IDを調べる手間が増えるのでいくつかは書き出しておいた方が良いです。
  • 実際にはBlank1Blank2などと番号の付いたIDを利用する事になりますが、例えばBlank1をコピーして何度も使い回す事も可能です。
    その場合でもInputxxのxxの部分の重複には注意です。
    但し、元のノードに実在する物でなくてはいけません。
    つまり、Blank100等としても元のノードに実在していなければ無効です。
  • また、マクロで使用しているノードの物でなければいけません。

    区切り線の利用例

ラベルコントロールについて

ノードのディフォルトのラベルはマクロ書き出し時に書き出す事ができません。
なのでコントロールエディタでラベルコントロールを追加して書き出すか、settingファイル内のUserConrolsで記述して作成、編集するかになります。
ラベルコントロールはその後の項目をいくつ纏めるかという設定方法になるので挿入位置が重要になります。
基本的には区切り線や他のコントロール等と挿入方法は同じです。


整形用スクリプト

以上のように順番を入れ替えたり区切り線を挿入したりしていると、番号がぐちゃぐちゃになってしまいます。
それ自体は読み込みやマクロの機能には何の影響もないので問題無いといえば問題無いのですが、なんとなく整然としていなくて気持ち悪いんですよね。
そこで、テキストエディタで再編集後バラバラになったInputxxを並び順で上から順番に昇順で番号を再インデックスするPythonスクリプトをAIに作ってもらいました。
Inputxxの番号に重複があっても番号の振り直しによって解消されるので安心です。

使い方

  1. スクリプトを.pyで保存
  2. ターミナルやコマンドプロンプトでPythonファイルを保存したディレクトリに移動
  3. python スクリプトファイル名.py 入力ファイルパスとコマンドを打ってエンター
  4. ファイル名の先頭にfixed_が付いた別ファイルが出力される
import re
import sys
import os
# `InputXX = InstanceInput {...}` のブロックを識別し、XXの部分を1から順番に振り直すスクリプト`
if len(sys.argv) < 2:
    print("使用方法: python script.py <入力ファイル名>")
    sys.exit(1)

input_filename = sys.argv[1]

output_filename = f"fixed_{os.path.basename(input_filename)}"

with open(input_filename, "r", encoding="utf-8") as file:
    data = file.readlines()

# `InputXX = InstanceInput {` を識別し番号を振り直す
input_pattern = re.compile(r'^(\s*)Input\d+ = InstanceInput {(\s*)$')
input_count = 0
new_data = []

for line in data:
    match = input_pattern.match(line)
    if match:
        indent = match.group(1)  #インデント量
        newline = match.group(2)
        input_count += 1
        line = f"{indent}Input{input_count} = InstanceInput {{{newline}"

    new_data.append(line)

with open(output_filename, "w", encoding="utf-8") as file:
    file.write("".join(new_data))

print(f"処理が完了しました: {output_filename}")

元ファイルを上書きする仕様では無いので一応安心ですが、念のためバックアップを取っておいた方が良いと思います。

Discussion