ダリアメモ@ブログ

日々思ったことや自分用のメモも含めプログラムの技術を淡々と書いていきます

C#のProcessクラスを用いてFBXを独自形式に変換する自作のコンバーターと連携させてみた

最近こんなもの作ってたのでタイトル通りやったことについてまとめようと思います。


○Processクラスとは?


C#のSystem.Diagnosticsにあるクラス。
主に外部のexeや関連付けされたファイル開くのに使える。
今回は前者の目的で使いました。


○ドラッグ&ドロップ処理

private void SceneFileDrop(object sender, DragEventArgs e)
{
    string readFilePath = null;
    //ドラッグ&ドロップしたファイルのパスを習得。
    string[] fileName = e.Data.GetData(DataFormats.FileDrop) as string[];
    //成功すると文字が入るのでそれを変数に代入
    if (fileName != null)
    {
        readFilePath = fileName[0];
    }
    //失敗なら処理しない
    else
    {
        return;
    }

    //拡張子がfbxならモデルを独自形式にコンバート
    if (System.IO.Path.GetExtension(readFilePath) == ".fbx")
    {
        FBXConvertToOriginalFormat(readFilePath);

    }
}


WPF側で用意されてるドラッグ&ドロップコールバック関数です。
中身はドラッグ&ドロップしたファイルの拡張子を確認してfbxだったら下記に記載してるコンバート関数を呼び出すだけです。


○コンバート処理

       
private void FBXConvertToOriginalFormat(string modelFilePath)
{
                
    System.Diagnostics.Process p = new System.Diagnostics.Process();

    //カレントディレクトリにある実行ファイルのパスを指定
    p.StartInfo.FileName = "Converter/Converter.exe";
  //シェル機能は使わないので無効化
    p.StartInfo.UseShellExecute = false;
  //出力、入力共に使わないので無効化
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardInput = false;
    //コマンドライン引数をモデルのパスに設定
    p.StartInfo.Arguments = modelFilePath;
    //実行ファイル開始
    p.Start();
    //終了するまで待機
    p.WaitForExit();
    //実行ファイルが終了したら閉じる
    p.Close();
}


Processクラスを用いて外部のexeを起動するプログラム。
コンバーターはexeが入ってるフォルダパスにフォルダを作ってそこにexeを入れています。
ただ、この設定のままだと関連付けした拡張子から呼び出して実行する際に、カレントディレクトリが呼び出した拡張子の場所になってしまって呼び出せないので、
ウィンドウ生成のタイミングでexe(自身)が入ってるパスをカレントディレクトリにするようにしてます。

//コマンドライン引数の0番目にexeのパスが入っているのでそれをカレントディレクトリに設定
string applicationPath = Environment.GetCommandLineArgs()[0];
string exeFullPath = System.IO.Path.GetFullPath(applicationPath);
string startupPath = System.IO.Path.GetDirectoryName(exeFullPath);
System.Environment.CurrentDirectory = startupPath;


今回のはコンバートしてるかわかりやすいようにコンソール出してますが、
コンソールを隠してC#の方てコンソールの代わりにプログレスバーを出して、
どこまでコンバートで来てるか%で表記して、
コンバーターから終了したか出力を受け取ってそれを元にプログレスバーを隠すといったことも可能だったりしそうですね。