スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
先日また MEL の妙な仕様を発見し、
そのせいでコーディングに手間をかけさせられてしまいました。

たとえば以下のようなコードを書いたとします。

global proc sameNameTest1()
{
string $vg[] = `circle -name "vegeta"`;
string $tr[] = `polyCube -name "trunks"`;

parent "trunks" $vg[0];
}
sameNameTest1;


ご覧の通り、単に Circle と Poly Cube を作成して
それらを親子付けしているだけです。

しかしこの例では親子付けの際に変数を使用せず
ノード名をそのまま使用しているので

一度は実行できますが、複数回連続して実行することができません。

"trunks" という名前のノードが重複してしまい、
親子付けの際にどちらのノードに対して実行すべきか分からなくなってしまうからです。

110717.png

そこでこのようにノード名を指定する際にノード名の頭に『|(パイプ)』をつけることで
親がいない方の trunks』ということを明示できるので正しく実行できます。

global proc sameNameTest2()
{
string $vg[] = `circle -name "vegeta"`;
string $tr[] = `polyCube -name "trunks"`;

parent "|trunks" $vg[0];
}
sameNameTest2;


しかし上記のような書き方は稀で、通常は変数を使用します。

global proc sameNameTest3()
{
string $vg[] = `circle -name "vegeta"`;
string $tr[] = `polyCube -name "trunks"`;

parent $tr[0] $vg[0];
}
sameNameTest3;


実はこれらのノード作成のコマンドには、作成したノード名を戻り値にする際に
「もし他にも同じ名前のノードが存在するなら頭に『|』をつける」という操作が含まれているので
これでも問題なく実行できます。
現に print してみると二度目以降は『|trunks』という文字列が格納されていることが分かります。

ただしここからが問題です。
NURBS やポリゴンの作成系コマンドや shadingNode コマンドなど、
ほとんどの作成系コマンドは問題ないのですが、
spaceLocator コマンドに関してはなぜか例外らしく

global proc sameNameTest4()
{
string $vg[] = `circle -name "vegeta"`;
string $tr[] = `spaceLocator -name "trunks"`;

parent $tr[0] $vg[0];
}
sameNameTest4;


このように書いたとしてもエラーが起きてしまいます。
このコマンドに関しては『|』をつけるという操作が含まれていないようです。

したがって、上の例と同様に頭に『|』を連結して

global proc sameNameTest5()
{
string $vg[] = `circle -name "vegeta"`;
string $tr[] = `spaceLocator -name "trunks"`;

parent ("|" + $tr[0]) $vg[0];
}
sameNameTest5;


このように書けばエラーもなく、正しい動作をします。

全てを検証したわけではないので spaceLocator 以外にも同様に例外があるかもしれませんが
同じように対処すれば問題ないはずです。

それにしてもまた妙な仕様だと思います。
何かの理由や他の対処法などを詳しくご存知の方がいましたら
是非とも教えてください。
コメント
管理者のみ閲覧可能にする
Profile
HN らい

都内某社テクニカルディレクター
都内某専門学校講師
都内某企業講師
元中国某社S3Dスーパーバイザー
Contact
(ENGLISH OK. 可以用中文。)
Categories
Archives
RSS Link
QR Code