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
- ディフォルト値です。必須ではありません。
- 設定しなければコントロールのディフォルト値又は
UserConrols
のINP_Default
が採用されます。 - インスペクタ上でコントロール名をダブルクリックした時にはこの値が採用されます。
-
UserConrols
でINP_Default
を設定していてもこちらが優先されます。 - コントロールの種類によって変わります。
(例)Point型のコントロールではDefaultX
,DefaultY
などとなります。
- Name
- インスペクタ上に表示されるコントロールの名前です。必須ではありません。日本語でも問題ありません。
- 設定しなければ、ディフォルトの名前や
UserConrol
のLINKS_Name
で設定した名前が採用されます。 - ディフォルトの名前や
UserConrols
のLINKS_Name
で設定した名前があってもこちらが優先されます。
- Page
- インスペクタ上で表示されるページを設定します。必須ではありません。
- 設定しなければ、ディフォルトのページや
UserConrol
のICS_ControlPage
で設定したページが採用されます。 - ディフォルトのページや
UserConrols
のICS_ControlPage
で設定したページがあってもこちらが優先されます。
その他最大値や最小値なども設定できますが、設定できる項目はコントロールの種類によって違います。
順番の入れ替え方
settingファイルのInputxx = InstanceInput {...}
の並び順がそのままインスペクタに表示されるコントロールの並び順です。
Inputxx = InstanceInput {...}
のブロックを選択して切り取り、貼り付け等で並び順を変更すると良いです。
入れ替え前
入れ替え後
また、上下を入れ替える等移動距離が少ない場合はVSCode
の機能を利用して移動したい
Inputxx = InstanceInput {...}
のブロックがある行を選択した状態でAlt+アローキー
の上下を押す事によって移動できるので便利です。
また、有志の方が作成した順番を入れ替えるツールも公開されていますので、そちらを利用するのも良いと思います。
区切り線や空白の挿入の仕方
- 元のノードにある区切り線や空白を利用します。
-
Blank
やSeparator
が区切り線です。ApplyBlank
だと空白です。 - マクロ書き出しの際に書き出しておく必要はありませんが、IDを調べる手間が増えるのでいくつかは書き出しておいた方が良いです。
- 実際には
Blank1
やBlank2
などと番号の付いたIDを利用する事になりますが、例えばBlank1
をコピーして何度も使い回す事も可能です。
その場合でもInputxx
のxxの部分の重複には注意です。
但し、元のノードに実在する物でなくてはいけません。
つまり、Blank100
等としても元のノードに実在していなければ無効です。 - また、マクロで使用しているノードの物でなければいけません。
区切り線の利用例
ラベルコントロールについて
ノードのディフォルトのラベルはマクロ書き出し時に書き出す事ができません。
なのでコントロールエディタでラベルコントロールを追加して書き出すか、settingファイル内のUserConrols
で記述して作成、編集するかになります。
ラベルコントロールはその後の項目をいくつ纏めるかという設定方法になるので挿入位置が重要になります。
基本的には区切り線や他のコントロール等と挿入方法は同じです。
整形用スクリプト
以上のように順番を入れ替えたり区切り線を挿入したりしていると、番号がぐちゃぐちゃになってしまいます。
それ自体は読み込みやマクロの機能には何の影響もないので問題無いといえば問題無いのですが、なんとなく整然としていなくて気持ち悪いんですよね。
そこで、テキストエディタで再編集後バラバラになったInputxx
を並び順で上から順番に昇順で番号を再インデックスするPythonスクリプト
をAIに作ってもらいました。
Inputxx
の番号に重複があっても番号の振り直しによって解消されるので安心です。
使い方
- スクリプトを
.py
で保存 - ターミナルやコマンドプロンプトで
Pythonファイル
を保存したディレクトリに移動 -
python スクリプトファイル名.py 入力ファイルパス
とコマンドを打ってエンター - ファイル名の先頭に
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