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ファイルを手当たり次第にコンバート
(コンパイル)し、ファイル名と同じグローバルプロシージャが見つかった時にメモリへ
常駐します。

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

0 件のコメント:

コメントを投稿