2018年1月25日木曜日

MELを使って別名保存を行う

膨大なフラグが存在するfileコマンド。
しかも幾つかのメインフラグと、それを補助する二次フラグに分かれていて、適切に組み合わせないと上手く動作しないクセにサンプルコードの種類が少ない厄介者です。

ふだん何気なく行っている操作で「シーンを別名で保存」というのがありますが、これをMELだけでやろうとすると意外とつまづくみたいです。

参考用にスクリプトエディタの履歴をみても、

file -f -save -options "v=0;";

としか表示されていません。
単純に考えて、

file -save -type "mayaAscii" "d:/hogehoge.ma";

みたいに最後に保存パスを指定してもエラーになります。
エラーを良く見ると、-save ではファイル名を指定できないから、先にリネームしろと言っています。
昔は回避方法とか記されていなかったような気がしましたが、良く起こす間違いなので追加されたのかな?

要は

file -rename "d:/hogehoge,ma";
file -save -type "mayaAscii";

と2つに分けて実行しろと云う事みたいです。

リネームの時、フルパスではなくファイルの名称だけで指定すると、カレントワークスペースへ保存されてしまう罠も仕掛けられているので要注意。

2017年12月12日火曜日

カーブオブジェクトの座標をスクリプトで使いやすくプリントする

昔、カーブオブジェクトのEP座標を表示するスクリプトを作ったのですが、スクリプトに組み込むには少し使い勝手が悪かったので、用途を限定し作り直してみました。

tryPrintCurveEP.mel


こんな感じでカーブオブジェクトを作成したら、選択状態でコマンドラインへ
tryPrintCurveEP 桁数
で実行。


2017年11月20日月曜日

melでフォルダのリストを作成する

たまにしか使用しないため備忘録。

melから指定パス内のファイルやフォルダのリストを作成するためのコマンド
getFileList

-folder(-fld)で調べたいパスを指定すると、そのパス内のフォルダ名とファイル名がリストで返されます。
getFileListには-filespec(-fs)という検索用のフラグがあり、ワイルドカードである程度返ってくるファイルを絞れます。

ここでちょっとつまづきます。
リストをフォルダだけに絞りたい場合は・・?

まぁ返ってきたリストをfiletest -dで判定すれば良いのかも知れませんが、スマートではないのでfilespecで何とかしたいところです。
で、フォルダって言うのは拡張子が無いってことなので、"*."を指定するわけです。こんな風に。

string $list[]=`getFileList -fld $path -fs "*."`;

このリストにはパスが付いていないので、使用する場合には
($path+"/"+$list[0])

みたいにする必要があります。


2017年10月23日月曜日

数値を四捨五入する

mayaで作業をしていると、数値を四捨五入したい事が結構でてきます。
そんな時のためのスクリプトを作成してみました。

ROUND.mel

シチュエーションに合わせて専用に作るのもなんなので、四捨五入しかしない単体機能です。

アニメーションを作っている時なんかは、こんな感じのスクリプトで呼び出すと良いかもしれないです。

{
    string $sel[]=`ls -sl -typ "transform"`;
    
    for( $e in $sel )
    {
        string $attrs[]=`listAttr -k -se -w $e`;
        for( $attr in $attrs )
        {
            string $NA=($e+"."+$attr);
            float $v=ROUND(`getAttr $NA`,2);
            
            setAttr $NA $v;
            
        }
        
    }
    
}

上のスクリプトを実行すると、channelBoxの数値がこんな感じになります。



まぁ、.maファイルへ保存すると希望の桁数で保存されているとは限らないので気休め程度なのですがね・・・。

------
pythonコマンドを使用することで簡単に処理する事ができます。

2017年9月11日月曜日

良く使う処理はコマンドで

dirnameなんかもそうですが、良く使う処理は既にコマンド化されていたりするみたいです。

まずは親のオブジェクト名を取得する処理。
{
   string $p[]=listRelatives -p $current`;
   print("\n"+$p[0]+"\n");

}
listRelativesは文字配列を返すため、いったん配列に代入しないといけないのは頂けません。
コレの代替コマンドは
{
    string $p = firstParentOf( $current );
    print("\n"+$p+"\n");

}
文字列で返ってくるのは中々良いのですが、オブジェクト名がロングネームでしか返ってこないので注意。


こういう時など、ロング名をショート名に変更したい場合、
{
    string $tmp[]= stringToStringArray( $long,"|" );
    string $short=$tmp[size($tmp)-1];

    print("\n"+$short+"\n");

}
こんな感じで配列の最後に入った値を取得するみたいな、なかなかの面倒くささ。
ネームスペースも外したい場合、更に複雑になりますね。

でも、この処理にも、こんなそのまんまの名称のコマンドが・・・。
{
    string $short = shortNameOf( $long );

    print("\n"+$short+"\n");
}
ただし、ネームスペースは分離できないようなので、その部分は自前で処理するしかなさそうです。

plugNodeStrippedを使用するとDAGパスとネームスペースを一気に除去できます。
2017/09/20追記


で、いちばん欲しいコマンドなのですが、指定したオブジェクトがどんなタイプなのかを調べる処理。
nodeTypeで調べても大抵 "transform"と返ってきます。
なので、子のshapeノードからタイプを調べる必要があるわけですが、これに専用のコマンドは無いようで、自力で行う必要があるみたいなのですね。
こんな風に。
{
    string $shape[]=`listRelatives -c -pa -ni -s $target`;
    string $type=`nodeType $shape[0]`;

    print("\n"+$type+"\n");

}

まぁ、transformノードに色々ブラ下げていると、nodeTypeに渡す値が$shape[0]に特定できないというのが原因だとは思います。