2016年7月26日火曜日

sourceのアレコレ

sourceについていくつか。

mayaの再起動をしないとsourceできない(ことはない)

mayaが起動している最中に.melファイルを追加した場合、mayaを再起動をしないとsource しても

// Error: Line 1.18: Cannot find file "hogehoge.mel" for source statement. // 

と、追加した.melファイルは見つからないようなエラーが出てしまいますが、コマンドラインで

rehash

を実行するとMELのスクリプトパスをチェックするので、新しいファイルが読み取られsource 
実行できるようになります。

ただし、global procの引数の量や型を変えた場合、sourcerehashを行っても更新されないので、
こういったケースの場合には再起動が必要です。

けっきょくは再起動するんかーいっ!


ファイル名の前にパスを付けるとスクリプトパス以外のフォルダも読み込める

たとえば、Dドライブのhogeフォルダにhoge.melがある場合、

source "d:/hoge/hoge.mel";

と絶対パスの指定が可能。自分は有効な手段を見出せていないですが、使い方はあなた次第。

本来の使い方と思しき、相対パスも可能。
MAYA_SCRIPT_PATH の中にサブフォルダを掘り、リグ関係のスクリプトをまとめるとします。
そんな場合、

source "RIG/tryRigCreaterCore.mel";

とすることでコンパイルが可能。
"../"でさかのぼることも出来ます。

もちろん/(スラッシュ)ではなく\(バックスラッシュ・円マーク)も使えますが、エスケープ
しないといけないので、スラッシュのほうが無難でしょう。


source した.melファイル内にsourceが記述されていると不安定になる

最悪mayaがクラッシュ

ループ処理の中にsource を使ったプロシージャが含まれていると、スクリプトのコンバートが
終了する前に呼び出してしまいmayaが強制終了してしまうことがあります。
乱用は要注意。



2016年7月14日木曜日

プロシージャのオブジェクト風表記。その2

mayaが.melファイル内のグローバルプロシージャを認識するタイミングは、起動時。
みたいな事でしたが、ここでも注意する事がひとつ。


起動時に行うスクリプトのコンバートでは、ファイル名と同じグローバルプロシージャまでしかコンバートされません。

なので、GUIなんかのコールバックはメインプロシージャの後ろに書くと初回エラーが出ます。
ボタンを押した瞬間にとか。
これは、AUTODESK AREA JAPAN の記事でも書かれていました。

とりあえずファイル名と同じ名前のメインプロシージャは最後に書いとけと言う事ですか。



前振りが長かったですが、本題。

.melファイルをクラスっぽく作成しようとした場合、メインプロシージャが無いのでコンバートされない問題が出てきます。
その場合の対処方法。

まずは、コンソールアプリで、引数が必要なプログラムがヘルプのエラー出力を出すみたいに、
メインプロシージャでグローバルプロシージャのリストをプリントする方法。

グローバルプロシージャを全部書きだすのは面倒ではある。
ま、空のプロシージャでも良いんですけど・・・。


このほかには、source を使用する方法もあります。
指定した.melファイルの内容全てをコンパイルするので、ファイル内の全てのグローバルプロシージャへアクセスする事ができるようになります。
なかなか便利な命令です。

デバッグ中は、シェルフに

{
    source "スクリプト名.mel";
    メインプロシージャ;

}

を追加しておくと重宝します。


本題みじかっ!


2016年7月12日火曜日

プロシージャのオブジェクト風表記。その1

プロシージャ名として使える文字に .(ドット)が有ることは意外と盲点。

けっこう前にAUTODESK AREA JAPAN の記事で読んでからは偶に使っていたりしますが、
記事に足りない Tips が有るので補足(みたいなこと)。

まず、MEL でローカルにスコープされたプロシージャを前方に参照することは許可されていません。
ローカルにスコープされたプロシージャの定義は、これらを呼び出す前に出現させる必要があります。

な・・・何を言ってるのか わからねーと思うが
おれも何をされたのかわからなかった・・・

頭がどうにかなりそうだった・・・


要は、呼び出されるローカルプロシージャは、呼び出す行よりも前に記述されていないといけない
という事です。
たとえば、

proc string _getHoge()
{
    return "hoge";
    
}


global proc printHoge()
{
    print(`_getHoge`+"\n");
    
}


は大丈夫ですが、

global proc printHoge()
{
    print(`_getHoge`+"\n");
    
}


proc string _getHoge()
{
    return "hoge";
    
}


となっていると、呼び出しているprint(`_getHoge`+"\n");よりも後ろに
_getHoge()を定義しているために、

// Error: file: ~~/scripts/printHoge.mel line 3: Cannot find procedure "_getHoge". //

と出て止まります。

記事には、1度実行すると解消されると云うような事が書かれていると思いますが、ローカル
プロシージャには通用しません。

結構このルールに嵌って全てをグローバルプロシージャにしてしまい、オーバーライドでバグっ!
をやってしまうようです。


で、mayaが.melファイル内のグローバルプロシージャを認識するタイミングですが、
起動時、MAYA_SCRIPT_PATH に配置されている.melファイルを手当たり次第にコンバート
(コンパイル)し、ファイル名と同じグローバルプロシージャが見つかった時にメモリへ
常駐します。

ここでもまた注意する事が有るのですが、長くなったので次回に続く。