Vegas Pro 18.0のC#スクリプトをVegas Pro 19.0で動かす際にやったこと

# 概要
Vegas Pro 18.0用に作成した C# のスクリプトを Vegas Pro 19.0 で動作させる際にやったことのメモです。

基本的には修正は必要ないはずですが、変な書き方をしていると、修正が必要になることがあるようです。今回は以下の3点を修正しました：

1. Generatorを取得する際に、GetChildByName()を使うのではなく、GetChildByUniqueID()を使う
2. Vegas Pro 18.0のスクリプトは.NET Framework 4.7.2だったのが、Vegas Pro 19.0では.NET Framework 4.8 に変更（VS2019でビルドする際に変更が必要）
3. RichTextBoxのデフォルトのフォントを取得する際に、Textを設定してSelectAll()したあとに取得するのではなく、RichTextBox を new した直後に取得する

# 背景
Vegas Pro 18.0 を使用して子供の動画編集をしています。動画編集する際の定型的な作業を自動化するために、いくつかスクリプトを作っています。

Vegas Pro 19.0がリリースされたので、Vegas Pro 18.0用にビルドした DLL が動作するかどうかを試してみました。すると、以下のスクリプトはうまく動作しませんでした。このスクリプトを Vegas Pro 19.0 で動くようにするためにやったことのメモを記載します。

https://github.com/miworky/Vegas_AddTextEventFromFilename


# やったこと
## 1. Generatorを取得する際に、GetChildByName()を使うのではなく、GetChildByUniqueID()を使う

タイムラインにテキストイベントを追加する際には、まず Media を生成する必要があります。この Mediaを生成する際に PlugInNode generator が必要です。この generator を取得する際に Vegas Pro 18.0 では以下のように取得できていました：

```javascript:
                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では以下の名前で取得できるようです：

```javascript:
                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 を以下のように取得するようにしました：


```javascript:
        // 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 では以下のように書いていました：

```javascript:
        // テキストを変える
        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 を取得するようにしました：

```javascript:
        // テキストを変える
        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 のいずれでも動作するようになりました。