2019年6月10日月曜日

デバッグで配列を表示する

スクリプトを組んでいたりすると、デバッグとかで配列に何が入っているかというのを調べる場面がよくあります。
python には enumerate というのがビルトインで存在しているのですが、MELにそんな便利なスクリプトは無いので自作するしかありません。
しかも引数の型が合っていないとエラーになるので、同じのを int, float, stringと3つ作らないといけない。
string用だけは作っていて、それで何とかしていましたが、たまに他の型のも欲しい場面があります。

いい機会なので3つの型に対応したスクリプトを作成してみました。



tryEnumerate.mel

たんに同じ処理を3回書くのも芸がないので、入り口は違っても、なるべく共通のコードになるよう書いています。

各型の配列には、~ArrayToString コマンドというのがあります。
これを使って一旦CSV形式の文字列にすることで、pythonコマンドへ渡すことも出来るし、ここ以降同じ記述にすることも出来ます。
文字列にしたら、それを pythonで split し、整数型でも浮動少数型でも文字配列型にしてしまいます。
配列数とか文字数とかMELの限界が試される感じですが、デバッグ用ツールなので、まぁいいか。

試しに mayaLT で確認したところ、けっこう限界は高そうです。


手っ取り早く、optionVar を渡しています。こんなに設定を保存しているのかぁ・・・。


MELで意外と盲点なのが size コマンドで、配列を渡すと配列数を返し、文字列を渡すと文字数を返してくれます。
.Length と .Count が使えるみたいな?長年使っているとたまに忘れたりします。

配列の桁数を数えたら、値の表示位置を合わせたいので、スペースで桁の差分を差し込みたい感じ。


ここでも pythonコマンドの登場です。
指定の文字で埋める処理が有るので、それを使用。
proc string _getString.rjust(
    string $str,                        ///< 基本の文字列
       int $width,                      ///< 最大文字数
    string $fillchar )                  ///< 補う文字※必ず1文字
/**************************************************************************//**
    @private
    @brief 長さ $width の右揃えした文字列を返します。
    @retval string型 右寄せで指定文字数になるような文字列を返す。
 ******************************************************************************/
{
    return `python ("'"+$str+"'.rjust("+$width+", '"+$fillchar+"')")`;
    
}


昔は while でループさせていましたが、なかなか汎用性の利きそうなコードです。


あとは、vector型にも配列あるんだよなぁ・・・。

0 件のコメント:

コメントを投稿