2016年3月24日木曜日

melファイルの改行コード

melスクリプトを作っていて、デバッグがてらエラーで止まったところのログを見ていたら
ちょっとした疑問がわいてきました。

サンプルスクリプトとして

global proc hogehoge()
{
 print("hogehoge")
 
 
}

と、わざとシンタックスエラーが出るようなスクリプトを作成して実行してみます。
ちなみに、3行目の行末にセミコロンが付いていません。

当然エラーが出て止まるのですが、矢印の部分。

改行してなくない?

ひょっとしてと思い、秀丸で改行コードをCRに変えてみたところ


エラーログが変わりました。

昔、fgetlineでcsvファイルを読みこんだとき、最後の語句に改行が余分にくっついて
難儀したのが役立った。

ということで、melファイルは改行コードにCRを使った方が良いみたいです。

でも、これだとメモ帳で開くと改行されないという罠。


2016年3月15日火曜日

maya LT で使えないMELコマンド

少しMELを知っている人であれば、辞書ファイルの作成で fprint を使っていない
ことに気づいたかもしれませんが、なんと、mayaLT2016 では、fopen,fprint,fclose
使えないということが発覚しました。

fopen がダメという事で、fgetline fgetword も使えないようです。

help コマンドでリストアップはされてはいるんですけどねぇ・・・。
他にも使えないコマンドはありそう。

とりあえず system も使えなかった。
maya LT から外部 exe を実行させることはできないのか!?


ちなみに、HumanIK の機能で[スケルトンテンプレートを書き出し...]を使うと、


// 警告: file: ~MayaLT2016/scripts/others/hikSkeletonUtils.mel line 809: fopen:~

と出て止まります。@Maya LT 2016 Extension 1
ご愛嬌ですわ。
Maya LT 2016 Extension 3ではfwriteAllTextを使うように修正されたようです。

fprint の代わりとおぼしき fwriteAllLines ですが、新設っぽいですね。
出力先ファイル名と出力文字のリストだけで完結するのは簡単で良いです。

しかし、maya と mayaLT で性能が違うらしく、書き込み量に制限が付いているらしい。
対の freadAllLines のほうは特に注釈無いみたいだけれども、制限あるんだろうなぁ・・・。

2016年3月10日木曜日

秀丸の単語補完

秀丸の単語補完用辞書ファイルを作成するために、スクリプト。

{
 string $dir=`workspace -q -dir`;
 print("\""+$dir+"\"\n");
 
 string $dicFile=($dir+"mel.dict");
 string $cmds[]=`help -l "*"`;
 fwriteAllLines( $dicFile,$cmds );
 
}


現在設定されているプロジェクトフォルダに mel.dict というファイルが作成されているはず。
たいていマイドキュメントの default フォルダ?

そしたら、その中の不要なコマンドなんかを削除していきます。

自分は~Ctxコンテキスト系のコマンドをまず削除。
次に先頭が大文字のコマンド。
7、8文字くらいの短いコマンド。
ココまできたら、あとは使わなそうなのを個別で・・・。

長くて偶にしか使わない物を厳選して、100か200くらいにします。
ややこしい綴りのものなんかもあると良いですね、polyListComponentConversion とか、
たまにしか使わないので忘れがち。
confirmDialog は結構使うけど発声と綴りが一致しなくてシンタックスエラーを起こすし。

stringArray系は複数あるので全部登録。これは maya のドキュメントからコピペ。

オプション用も欲しいと思うかもしれませんが、短縮形が有ったりするので、登録してても
意外と使わなかったりします。


で、ここへスクリプトに良く使う構文も追加。
print("\n\n");
for( $; $; $++ ){}
for( $ in $ ){}
 ******************************************************************************/
/** **/
/******************************************************************************
//------------------------------------------------------------------------------
これらは、よく使いますね。
そしたら、Program Files の Hidemaru フォルダへ mel.dict を移動。


ようやく秀丸エディタで単語補完の設定を開始。

メニュー -> その他 -> ファイルタイプ別の設定

から、「その他」「単語補完」のタブにします。
「辞書ファイル」にチェックを入れて、移動した mel.dictを指定。


次に、すぐ下にある[ 詳細(X)...]ボタンを押して
こんな感じで設定。

「強調表示の定義(H)」にチェックを入れると、正規表現を使っている強調表示で単語補完がうまくいかなくなるようので付けない。


[ さらに(M)...]ボタンを押して

「単語の先頭文字」の欄に、スペース、スラッシュ、ハイフンの三文字入力。


最後に単語補完のショートカットキーを設定。
自分の場合、[Ctrl]+[Enter]を指定しています。



これでスクリプト作成が楽になります。

2016年3月9日水曜日

リグのコントローラを考えてみた

リグを組む時たいていカーブオブジェクトで形を作ってコントローラとするのが普通。
なんか、もっと他の方法が無いかと思って、いろいろとドキュメント類を探索。

こんなノードが有った。



しかも、タイプがジョイントなので x-ray joints 使えばポリゴンを透過してくれる
おまけ付き。


こんな風に配置すれば・・・


昔の Motion Builder っぽい。

ま、HumanIk のノードだから当たり前か。
このノードには HumanIk を制御する為のアトリビュートが幾つか存在していますが、
アトリビュート単体では稼動しないもよう。

制御しているノードは他にあるみたいで、正しく接続されていないと計算してくれない。
コントローラとして使う分には、translate,rotate,scale にキーが打てればよいので
隠しておけばよいか。

ただ、アウトライナのアイコンがスクリプトなんですよねぇ。
curveShapeでも差し込んで偽装するのも手か。

2016年3月8日火曜日

「配列は参照渡し」について

たとえば、

proc testCallByReference(
    int $value,                         // 値
    int $array[] )                      // 配列
/******************************************************************************
    参照渡しのテスト
 ******************************************************************************/
{
    $value=($value+1);
    $array[0]=($array[0]+1);
    
}


// main procedure.
{
    int $value;
    int $array[];
    $value=1;
    $array[0]=1;
    
    testCallByReference( $value,$array );
    print("\n-- 結果 --");
    print("\n   $value: "+$value);
    print("\n$array[0]: "+$array[0]);
    
}


こんなスクリプトで、通常のインテジャーと配列のインテジャーを引数にして
testCallByReferenceから帰ってくると、
$valueのほうは1のままで、$arrayは2になって返ってきます。


配列はプロシージャ間を行き来できるようになっています。
この特徴を利用して、再帰処理と組み合わせると、階層構造の解析などが楽に行えます。

まず HumanIK の Skeleton を作成した状態で、下のスクリプトを実行すると、

proc createHierarchyTrans(
    string $myname,
    string $CBR_names[],
    string $CBR_tx[],
    string $CBR_ty[],
    string $CBR_tz[] )
/******************************************************************************
    ジョイント名と座標を取得※再帰
 ******************************************************************************/
{
    $CBR_names[size($CBR_names)]=$myname;
    $CBR_tx[size($CBR_tx)]=`getAttr ($myname+".tx")`;
    $CBR_ty[size($CBR_ty)]=`getAttr ($myname+".ty")`;
    $CBR_tz[size($CBR_tz)]=`getAttr ($myname+".tz")`;
    
    string $childs[]=`listRelatives -c -typ "joint" $myname`;
    if(!`size $childs`) return;
    
    for( $child in $childs ) createHierarchyTrans( $child,$CBR_names,$CBR_tx,$CBR_ty,$CBR_tz );
    
}


// main procedure.
{
    string $hips[]=`ls -typ "joint" "*_Hips"`;
    
    string $names[];
    string $tx[];
    string $ty[];
    string $tz[];
    createHierarchyTrans( $hips[0],$names,$tx,$ty,$tz );
    
    
    int $size=size( $names );
    for( $i=0; $i<$size; $i++ ) print("\n"+$names[$i]+": "+$tx[$i]+", "+$ty[$i]+", "+$tx[$i]);
    
}


階層構造のジョイント名とローカル座標が表示されます。

通常、ひとつしか取得できない返値を複数持っているように振る舞えます。
無駄に global 変数を使わなくて済むということですね。


配列の寿命は普通の変数と扱いが違っているので、ループの中で使う場合などでは、意図しない配列になることがあるので注意が必要です。
特にスクリプトエディタ上では前回実行した内容が残っている場合があります。

2016年3月3日木曜日

スクリプトエディタで余り気にしていないであろう事

軽くスクリプティングする時に便利なスクリプトエディタ。
ココで宣言した変数がどうなっているか意識していない人が意外と多いのでは?


たとえば、スクリプトエディタで変数宣言をし、



グローバル変数の名前を返すenvコマンドを実行してみると、



宣言した変数が出てきます。



要は、スクリプトエディタで宣言した変数はグローバル宣言しなくてもグローバル変数になってしまうということです。
※プロシージャも同様。

スクリプトエディタを何回も実行する場合、初期化していないと意図しない結果になる場合があります。

コレを防ぐには、毎回初期化するか、MELの変数の寿命はブロックの範囲内ということで、波括弧で囲うことをします。

mayaを再起動して、さっきのスクリプトを波括弧で囲んでから実行。


その後envコマンドを実行してみると、



今回は宣言した変数が出てきません。

ただし配列の場合、特殊な挙動(参照渡し)をするので、コマンドのリザルトを宣言と同時に設定しないときには、
使う前に clear した方が安全です。

2016年3月1日火曜日

MayaLT購入

ライセンス体系が変わるとか、忙しかったりなどで放置状態だったMayaLT。

2月からサブスクリプションのみになるということで、Autodeskストアでようやく購入手続き。

とりあえず、期間1年、サポート無しで33000+税



購入後、体験版の期限切れだったMayaLTは、試用期間30日として復活。
ライセンス到着まではコレで過ごせと言う事らしい。



うわさのStingrayもダウンロードできるようだったのでインストール。
一緒にScaleformもインストールされていた。

Stingray は windows Aero が有効になっていないと起動しないっぽい。

どちらも基本英語でしかチュートリアルが無いし、本格的にいじろうとしたらluaを覚えないといけないのか?


Games Launcher というのもインストールされたが、これはアセットストアのツールのようだ。
streamみたいな。



mayaのメニューバーのヘルプからサイトへアクセスしようとしたら、なぜか

firefoxhtml shell open command

ホニャララというエラーが出て Firefox が開かなかったのだが、既定のブラウザへ再設定することで直った。



会社でも作ったようなものだったりも、いろいろと車輪の再発明しまくるか!