概要
Vegas Pro 18.0用に作成した C# のスクリプトを Vegas Pro 19.0 で動作させる際にやったことのメモです。
基本的には修正は必要ないはずですが、変な書き方をしていると、修正が必要になることがあるようです。今回は以下の3点を修正しました:
- Generatorを取得する際に、GetChildByName()を使うのではなく、GetChildByUniqueID()を使う
- Vegas Pro 18.0のスクリプトは.NET Framework 4.7.2だったのが、Vegas Pro 19.0では.NET Framework 4.8 に変更(VS2019でビルドする際に変更が必要)
- RichTextBoxのデフォルトのフォントを取得する際に、Textを設定してSelectAll()したあとに取得するのではなく、RichTextBox を new した直後に取得する
背景
Vegas Pro 18.0 を使用して子供の動画編集をしています。動画編集する際の定型的な作業を自動化するために、いくつかスクリプトを作っています。
Vegas Pro 19.0がリリースされたので、Vegas Pro 18.0用にビルドした DLL が動作するかどうかを試してみました。すると、以下のスクリプトはうまく動作しませんでした。このスクリプトを Vegas Pro 19.0 で動くようにするためにやったことのメモを記載します。
やったこと
1. Generatorを取得する際に、GetChildByName()を使うのではなく、GetChildByUniqueID()を使う
タイムラインにテキストイベントを追加する際には、まず Media を生成する必要があります。この Mediaを生成する際に PlugInNode generator が必要です。この generator を取得する際に Vegas Pro 18.0 では以下のように取得できていました:
PlugInNode generator = vegas.Generators.GetChildByName("VEGAS Titles & Text");
Media media = Media.CreateInstance(vegas.Project, generator);
このコードを書いたときには、"VEGAS Titles & Text"という名前を見つけるのにものすごく苦労しました。いろんなコードを参考にしたりして試行錯誤しているうちに、たまたまこの名前を指定したら、ほしいものが取れたのでした。
Vegas Pro 19.0では"VEGAS Titles & Text"では取得できなくなってしまいました。Vegas Pro 19.0では以下の名前で取得できるようです:
PlugInNode generator = vegas.Generators.GetChildByName("Titles & Text");
Media media = Media.CreateInstance(vegas.Project, generator);
名前で取得するコードだと、今回のように名前が変わってしまったときに困ります。まさか名前が途中で変わるとは思っていなかったのですが、変わってしまうことが分かった以上、別の手段で generator を取得した方がよいと考えました。メソッド一覧を見ていると、UniqueIDでも取得できるようなので、取得した generator の UniqueID を調べてみました。
"Titles & Text" の UniqueID は "{Svfx:com.vegascreativesoftware:titlesandtext}" であることがわかりました。これは、Vegas Pro 18.0 でも Vegas Pro 19.0 でも同じようです。
そこで、generator を以下のように取得するようにしました:
// Titles & Text のジェネレータを取得する
private PlugInNode GetGeneratorTitlesAndText(Vegas vegas)
{
PlugInNode generator = vegas.Generators.GetChildByUniqueID("{Svfx:com.vegascreativesoftware:titlesandtext}"); // Titles & Text
return generator;
}
せっかくなので generator を取得する関数を追加して、その関数を呼び出して取得するようにしました。
2. Vegas Pro 18.0のスクリプトは.NET Framework 4.7.2だったのが、Vegas Pro 19.0では.NET Framework 4.8が必要(VS2019でビルドする際に変更が必要)
Vegas Pro 19.0 の ScriptPortal.Vegas.dll を参照に登録するとこの変更が必要になります。
3. RichTextBoxのデフォルトのフォントを取得する際に、Textを設定してSelectAll()したあとに取得するのではなく、new した直後に取得する
テキストイベントのテキストを変更する関数は Vegas Pro 18.0 では以下のように書いていました:
// テキストを変える
private long ChangeText(OFXEffect ofxEffect, string newText, float fontSize)
{
OFXStringParameter textParam = ofxEffect.FindParameterByName("Text") as OFXStringParameter;
{
string rtfData = textParam.Value; // デフォルトで入っているテキスト
RichTextBox richtextBox = new RichTextBox();
richtextBox.Rtf = rtfData;
richtextBox.Text = newText;
richtextBox.SelectAll(); // 全テキストが対象
FontFamily fontFamily = richtextBox.SelectionFont.FontFamily;
richtextBox.SelectionFont = new System.Drawing.Font(fontFamily, fontSize); // フォント変更
textParam.Value = richtextBox.Rtf;
}
return 0;
}
今回変更したいのはフォントサイズなのですが、フォントサイズを変更するには fontFamily も指定しないといけないようです。fontFamily はデフォルトのままでいいので、あらかじめ fontFamily を取得しています。.NET Framework 4.8 にしたせいかどうかはわかりませんが、これでは動作しなくなりました。そこで、以下のように、RichTextBox を new した直後に fontFamily を取得するようにしました:
// テキストを変える
private long ChangeText(OFXEffect ofxEffect, string newText, float fontSize)
{
OFXStringParameter textParam = ofxEffect.FindParameterByName("Text") as OFXStringParameter;
{
string rtfData = textParam.Value; // デフォルトで入っているテキスト
RichTextBox richtextBox = new RichTextBox();
FontFamily fontFamily = richtextBox.SelectionFont.FontFamily;
richtextBox.Rtf = rtfData;
richtextBox.Text = newText;
richtextBox.SelectAll(); // 全テキストが対象
richtextBox.SelectionFont = new System.Drawing.Font(fontFamily, fontSize); // フォント変更
textParam.Value = richtextBox.Rtf;
}
return 0;
}
まとめ
上記の修正によりビルドしたDLLは、Vegas Pro 18.0 と Vegas Pro 19.0 のいずれでも動作するようになりました。