2019年07月17日

発想は悪くない

...んですが、実装はちと チカラワザ が過ぎましたな。
sm35402391


(7/19追記) さっそく対応されたようですよ → sm35419659

スマートな (よくある) 実現方法としては、外部のウィンドウ操作系スクリプトやそれ系のAPIを使うことが多いように思います。

※有名どころだと UWSCとか(なんか色々消えてるらしい?)。検索するとその手のツールは色々見付かります。

件のパターンなら、

1. TransformViewの "#個別モーフ確認" をON
2. モーフリストを上から走査しつつ (先頭要素選択からキー下入力)、表示画面のウィンドウ内容をキャプチャし加工保存

ぐらいで実現できるので、面倒なのは View内の各コントロールハンドルの取得あたりでしょうか。

まあ (予めモデル情報の精査は必要ですが) 同じような発想で MMD本体でも同様のブツは作れたりするので、自動化でラクしたい方なんかは色々情報をあさってみるのもよいかもしれませんね。


...と、頑張っている方たちに冷や水浴びせているだけではアレなので、一応 対応?的なことをやっておきました。

以下にサンプル置いておくので後はお好きなように。

※PMX用のプラグインはあまり太らせたくないので、旧仕様に突貫で拡張を施しておきました。↑でも書いてありますが、操作マクロ系拡張は十分に方法論が確立されているので、わざわざプラグインとして専用機能を用意していくのは気が進むものではないですね (面倒)


!! PmxEditor_0254g 以降が必要
コード上でダブルクリックをおこなうと内容を選択できます。CSScript の簡易形式にそのままコピペで実行可能です。

■テストコード1 : View画面をクリップボードへキャプチャ
// PmxView画面をクリップボードへコピー(キャプチャ)
Clipboard.SetImage(view.GetClientImage());

// SubView
//Clipboard.SetImage(connect.View.PmxViewHelper.SubView.GetClientImage());

// TransformView
//Clipboard.SetImage(connect.View.TransformView.GetClientImage());

----
■テストコード2 : モーフ一覧を画像で出力(参考用)
/*
* 全モーフを一覧で画像出力します/適宜表示状態を変更してください.
* 一時フォルダにMorphImageOutフォルダを作成します
* 不要になったら要削除
* なお掲載用の参考版なので各自改変してご利用ください.
*/

// 画像出力先 = 一時フォルダ以下
var dir = Path.Combine(Path.GetTempPath(), "MorphImageOut");
if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); }

// 有効ファイル名判定用
var invals = Path.GetInvalidFileNameChars();
Func< /*このコメントはブログの表示が変になるため(元ソースには何もありません)*/
string, bool> checkName = (string name) => { return name.IndexOfAny(invals) < 0; };

// TransformViewは表示しておく
var tv = connect.View.TransformView;
tv.Visible = true;

// 変形はリセット
tv.ResetTransform();
// 個別モーフ確認をON
tv.MorphChecker = true;
int c = 0;
foreach (var m in pmx.Morph) {
try {
// "m[番号(4桁)]+_[モーフ名]" / 無効な場合は番号のみ
var path = Path.Combine(dir, "m" + c.ToString("0000") + (checkName(m.Name) ? "_" + m.Name : ""));
// モーフ対象を選択 → 変形適用
tv.SelectedMorphIndex = c;

// TransformViewの画面を取得し保存 | このjpegは画質が悪いので注意
path = Path.ChangeExtension(path, ".jpg");
tv.GetClientImage().Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch {
// 掲載用なのでここではスルーしておく
}
c++; // カウンタを進める
}

// モーフ確認をOFF
tv.MorphChecker = false;
// 対象フォルダを開く
System.Diagnostics.Process.Start(dir);



以上




posted by - at 02:30| PMX | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。