public void Run(CommandArgs e) { e.Cancel = true; try { // 選択中モデル取得 // 非選択で null の場合もある var model = this.ActiveModel; // 設定ダイアログ表示 using (var dialog = new LipAndCapDialog(this.EnglishMode, model)) { dialog.Text = this.PluginName; var result = dialog.ShowDialog(this.ApplicationForm); if (result == DialogResult.OK) { // 口パク&字幕設定 if (model != null) { ApplyLip(model, dialog); } ApplyCaption(dialog); e.Cancel = false; } } } catch (ApplicationException ex) { ShowErrorDialog(ex.Message, false); } catch (Exception ex) { ShowErrorDialog(ex.Message, true); } }
/// <summary> /// ダイアログの結果を基に口パクを設定する。 /// </summary> /// <param name="model">設定対象のモデル。</param> /// <param name="dialog">呼び出し済みのダイアログ。</param> private void ApplyLip(Model model, LipAndCapDialog dialog) { if (!dialog.LipEnabled) { return; } // 実フレームデータテーブル作成 var table = dialog.MakeMorphFrameTable(this.Scene.MarkerPosition); if (table == null) { return; } // 範囲外のキーフレームを削除 if (dialog.LipSpanType == FrameSpanType.All) { var maxPos = this.Scene.MarkerPosition + dialog.LipSpanFrame; foreach (var frms in table.Values) { frms.RemoveAll(f => (f.FrameNumber > maxPos)); } } // キーフレームを設定 foreach (var mf in table) { var morph = model.Morphs[mf.Key]; if (morph != null) { morph.Frames.AddKeyFrame(mf.Value); } } }
/// <summary> /// ダイアログの結果を基に字幕を設定する。 /// </summary> /// <param name="dialog">呼び出し済みのダイアログ。</param> private void ApplyCaption(LipAndCapDialog dialog) { if (!dialog.CaptionEnabled || dialog.CaptionFrameLength <= 0) { return; } // 字幕データ作成 var caption = dialog.MakeCaption(this.Scene, this.Scene.MarkerPosition, 0); if (caption == null) { return; } // 字幕を設定 this.Scene.Captions.AddCaption(caption); }