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 件のコメント:
コメントを投稿