pmxEditerのpluginについて

3DCGソフトにpmxのデータを手動で移行するのがめんどくさくなってきたのでスクリプトを作ろうと思ったのですが、リファレンスが見つからなくて苦労したのでネット上のサンプルを増やすためにここにggるのに数時間使った結果を書いときます.
こちら TransferWeights(PMX) - BowlRoll のソースを参考にさせていただいてます.
では、地味に手作業ではめんどくさい、全材質名とテクスチャパスをテキストファイルに保存するものを作ります.
中身に興味ない人はここから.dllを\_plugin\Userに入れてください.
ExportMaterialName.zip - Google ドライブ

編集(E)>プラグイン(P)>CSScript>C#スクリプト(S) で開くウィンドウから作成・実行します.簡易形式と一般形式がありますが、一般形式で書いたほうが後々楽だと思います.
で、

try {
            // ここへ処理を追加してください.
            

        }

のとこに本体を書きます.
まず基本的にリファレンスは表示(V)の中のやつを見ればよいですが、ファイル書き出し周りの記述が書いてないので既存の配布されているソースコードを参考にします.
さて、まず次のおまじないを書いときます

// ホスト配下
IPEPluginHost host = args.Host;
IPEConnector connect = host.Connector;

			
// PMX関連			
IPXPmx pmx = connect.Pmx.GetCurrentState();     // PMX取得
IList<IPXMaterial> material = pmx.Material;     // material :材質   | リスト

pmxediterで扱える各データへアクセスするためのオブジェクトは元から用意されてないらしく、これを書いて適当に格納しておく必要があります.とりあえずこうしてIPXPmxを取得さえしていれば、リファレンスに書いてあるPmx以下のオブジェクトにアクセスできるようです.
今回は材質リストが欲しいのでpmx.Materialを取得します.頭についてる宣言はIPXMaterialのリストを示しています.
材質リストさえ手に入ればforeachで名前をとってこれば目的は達成できそうです.これをテキストファイルに出したいというときは、StringBuilderを使うことで簡単にできるようです.

string f = pmx.FilePath;
StringBuilder sb = new StringBuilder();
var i = 0;
foreach (IPXMaterial m in material){
  i++;
  string line = string.Format(i.ToString());
  sb.AppendLine(line);
  line = string.Format(m.Name);
  sb.AppendLine(line);
  line = string.Format(f + @"\" + m.Tex);
  sb.AppendLine(line);
}

これは3行を一セットとして、材質番号(ループ内部のi++でカウントしていく,ここではi>0)、材質名(IPXMaterial.Nameから取得)、テクスチャパス(内部で相対パスで指定されていることを前提に、Pmx.FilePathから読み込んでいるpmxファイルの絶対パスをとってきて、そのあとにIPXMaterial.Texから取得した相対パスをくっつける)記入するようにしています.
.AppendLine()は改行して記入してくれるようで楽です.また、@"\"と書くことで\を文字列とできるようです.
保存先をファイルダイアログで指定できるようにします.参考ソースまんまですが

// ファイルダイアログ表示
using (SaveFileDialog dlg = new SaveFileDialog()) {
  dlg.Filter = "txt files (*.txt *.csv)|*.txt;*.csv|All files (*.*)|*.*";
  if (dlg.ShowDialog() == DialogResult.OK) {
    // CSVファイルとして保存
    File.WriteAllText(dlg.FileName, sb.ToString(), Encoding.GetEncoding("shift_jis"));
    }

こんな感じでいけるようです.SaveFileDialogを作って、.ShowDialog() で開いて、OKが押されたらFile.WriteAllText()で保存する、という感じですね.
pmxは基本日本語なので3つ目の引数は大事です.
さて最後にこれをdllにしておくと起動が楽です.名前をつけたいところですが、それは // ここへ処理を追加してください.の上に書いてある

// コンストラクタ
    public CSScriptClass() : base()
    {
        // 起動オプション
        // boot時実行(true/false), プラグインメニューへの登録(true/false), メニュー登録名("")
        m_option = new PEPluginOption(false, true, "CSScript生成プラグイン");
    }

のPEPluginOption()を使うとできるようです.
まとめると以下になります

// 起動オプションのところに

m_option = new PEPluginOption(false, true, "全材質名保存");

// ここへ処理を追加してください.のところに

// ホスト配下
IPEPluginHost host = args.Host;
IPEConnector connect = host.Connector;
		
// PMX関連			
IPXPmx pmx = connect.Pmx.GetCurrentState();     // PMX取得
IList<IPXMaterial> material = pmx.Material;     // material :材質   | リスト

string f = pmx.FilePath;
StringBuilder sb = new StringBuilder();
var i = 0;
foreach (IPXMaterial m in material){
  i++;
  string line = string.Format(i.ToString());
  sb.AppendLine(line);
  line = string.Format(m.Name);
  sb.AppendLine(line);
  line = string.Format(f + @"\" + m.Tex);
  sb.AppendLine(line);
}
// ファイルダイアログ表示
using (SaveFileDialog dlg = new SaveFileDialog()) {
  dlg.Filter = "txt files (*.txt *.csv)|*.txt;*.csv|All files (*.*)|*.*";
  if (dlg.ShowDialog() == DialogResult.OK) {
    // CSVファイルとして保存
    File.WriteAllText(dlg.FileName, sb.ToString(), Encoding.GetEncoding("shift_jis"));
    }
}

言語からじゃなくてソフトからコーディングをやり始めるとこういうときに大変ですね...