« アウトライナで勝手に検索フィールドがアクティブで激怒。の続き。 | トップページ | scriptJob で複数行。 »

2016年3月16日 (水)

未来永劫 aaa で激怒。

Maya さまって、同じ階層レベルでは同じ名前は存在できないけど、親子レベルがひとつ違うと、もう、同じ名前が存在できるんですね。 ふーん。


つまり兄弟は同じ名前にはできないけど、
親子が同じ名前なのは、アリなんですね。

私の親の名前は aaa。
私の名前は aaa。
私の子供の名前は aaa。
私の子供の子供の名前は aaa。
私の子供の子供の子供の名前は aaa。

この先ずっと、私の家系の第一子の名前は aaa。
いつまでも aaa。
未来永劫 aaa。
aaa。



Aaa


あのですね、このしくみが、スクリプト書くのをどんだけ大変にしてるか、わかりますか Maya さま。


ネームスペースが違えば同じ名前が存在できるってのは分かりますよ。 おらの村でも、Model がその役割を果たしてましたからね。

でも同じネームスペース以下で、同じ名前を許してしまうと、ちょっとしたスクリプトを書こうにもいろんな余計な処理をしなくてはならなくなるのですよ。

そんなことないですか? 俺、シロートだからテキトーなこと言ってるかも知れません。専業プログラマでも専業TDでもありません。個人レベルのスクリプト書きです。

その個人レベルにとっては、これ、たったこんだけのことで、すんげえハードル上がります。



ぬるぬる というツールの Maya 版を書いていたんですが、よくエラーになるんですよ。 よくよく見てみると、ぬるぬるによって生成されたオブジェクトは、 prefix + 元の名前 みたいな命名規則にしているもんだから、1回実行した後、親子組み替えて、また最初と同じオブジェクトを選択して実行したりすると、容易に同じ名前のオブジェクトが存在してしまうんですね。 そうなると、どれが目的のオブジェクトだか特定できませんよ的なエラーが出ちまったりしているようでした。


とりあえず工夫して回避できたように見えるけど、なんだかね。 「そんなの当たり前だろ、それを工夫して回避するのがツール書きだろ」 とか言われそうですけどね。 おらの村では、そもそも同じネームスペース下に同じ名前は存在できなかったし、存在させようとすると自動で解決されてた(数値が付加されてユニークネームになっていた)もんだから、これで工夫したことなんてありませんでしたわ。  他のツール書きでも、これでさんざん困ってますね。 苦労すべきはここじゃないだろう、って思うわけですよ。 



ん~  同じ階層の中では、世代が変わっても同じ名前はダメ!という厳しいユニークネーム制度にして欲しいなあ。色んなことが、すんごいラクになるんだけどなあ。 でもこれ、アプリケーションの構造の根本に関わりそうな部分だから、きっと永遠に変わらないでしょうね。



もうお年なんだからご無理はせず、
どうぞお早く引退なさって下さいMayaさま。



.

|

« アウトライナで勝手に検索フィールドがアクティブで激怒。の続き。 | トップページ | scriptJob で複数行。 »

コメント

long nameで判断するのでは不足でしょうか?

groupA
L geoA (1)
groupB
L groupC
L geoA (2)

(1)→groupA|geoA
(2)→groupB*|geoA

てな感じで判別出来ます。
まぁ、確かにパッと見分かりにくいので名前が重複してないのが一番いいんですが・・。

投稿: re | 2016年3月18日 (金) 16時11分

階層の部分のスペースが消えて分かりにくくなってしまったのでもう一度...

groupA
..L geoA (1)
groupB
..L groupC
........L geoA (2)

投稿: re | 2016年3月18日 (金) 16時15分

こんにちは。ご親切にありがとうございます!!

しかし、おっしゃる意味が、分かりません orz
いや、意味は分かるのですが、具体的にどうスクリプトに落とし込めばいいのか、ちっとも分かりません。
俺が Maya のスクリプティングにちっとも精通してないからです。

その long name とやら、想像するに、どうやら親子階層まで含めたフルパスの記述であり、フルパスで書けばどのオブジェクトも必ずユニーク名になるから、たとえ同じ名前のオブジェクトがシーンの中に存在しても任意の1つを特定できますよ、ということをおっしゃりたいのだと思います。 その考えが合っていたとして、しかし、じゃあどうスクリプト書けばいいのか、分かりません orz

省略したコードですが、こういうことをやっています。

(mel)
string $locatorName = "P_" + $obj;
$newLocator = `spaceLocator -name $locatorName`;
parent $newLocator $Parent;

$obj があり(選択しているオブジェクトとか)、その名前の先頭に "P_" を付加したものを、新しいロケータの名前にしています。 元のオブジェクトが aaa だったら、新しいロケータは P_aaa になります。 そして $Parent で指定したオブジェクトの子供にします。

しかし、P_aaa や $Parent に入ってるオブジェクトの名前がシーンの中に複数存在した場合、最後の parent コマンドで怒られます。 「こいつに親子付けしろとお前は言うけど、複数いるうちどいつのこと言ってんだよ!」 と Maya さまに叱責されます。

なので、基本的に $Parent で指定しているオブジェクトを、ロングネームで取得できれば、parent コマンドにそのロングネームで渡してあげればいいのだと思うのですが、どうやったらロングネームを取得できるのでしょうか?


って、意味通じますでしょうか。

もうね、まだ基本的なことがね。日々疲れます。
でもまあ、毎日ヴァリヴァリ使ってますよ。
実写映画のアニメーション仕事で。
日々苦しいけど、仕事だから仕方ないですね~

投稿: 潤樹 | 2016年3月18日 (金) 17時50分

あ。ちょっと説明間違えました。

$parent の方は、listRelative コマンドで -fullPath オプションつけているので、フルパスで取得できてます。つまり親になるべきオブジェクトは、シーンの中の特定の1つを指し示すことができています。

しかし子になるべきオブジェクトの方、この例の場合は spaceLocator で作ったロケータですが、このロケータの名前がシーンの中でユニークでなかった場合、parent コマンドで怒られてしまうのです。


実際のスクリプトではないのですが、この状況を説明するために、こういう風にしてみました
画像↓
http://junkithejunkie.cocolog-nifty.com/tmpImage/uniqueName.jpg

左側、赤線で示すように、aaa は2つ存在します。
コマンドでは parent aaa hagehage; としています。
しかし、aaa が2つあるために、「aaa が複数あるんじゃこのヴォゲ」と怒られています(緑色)


しかし、さっき実験してみて、この場合なら

parent |aaa hagehage;

と書けばいいと分かりました。 |aaa と書くことで、ルートにある aaa という表現ができるのですね。

しかし実際のスクリプトでは、

(mel)
string $locatorName = "P_" + $obj;
$newLocator = `spaceLocator -name $locatorName`;
parent $newLocator $Parent;

このように書いているのですが、3行目 parent $newLocator $Parent; のところで、この $newLocator の部分を 「ルートにある $newLocator 」という書き方にできれば良さそうだと思うのですが、どう書けばいいのか分かりませんでした。 ためしに "|" + $newLocator などとしてみても、シンタックスエラーで怒られました。

どうしたらよいでしょう。
伝わりますでしょうか(汗

投稿: 潤樹 | 2016年3月18日 (金) 18時25分

すいません・・、普段はRSSの更新通知で見ているもので、自分がコメント書いたことすっかり忘れていました。。。
この場合ですとパッと思いつくやり方は2つあって、

A
string $locatorName = "P_" + $obj;
$newLocator = `spaceLocator -name $locatorName`;
$newLocaterRoot = "|" + $newLocator;
parent $newLocatorRoot $Parent;

B
string $locatorName = "P_" + $obj;
$newLocator = `spaceLocator -name $locatorName`;
parent ("|" + $newLocator) $Parent;

としてやる必要があります。
カッコで囲まないとMELさんは "|" や + をparentの引数として受け取ってしまうはずです。
分かり難いですよね。

もう解決してしまっているかもしれませんが、お力になれれば幸いです。

投稿: re | 2016年3月28日 (月) 22時01分

うおーーー そう書けば良かったんですか!! そうか、あらかじめ "|" が付いた変数を作るか、コマンド1行で書こうと思ったらカッコ付きにすればいいんですね!

やってみる・・・!
俺が文法知らないだけじゃねえか orz
でもやっぱり同一名存在可能制度反対です俺はw

超ありがとうございます。どこのどなた様ですか。このふざけたブログに、ふざけもせず大真面目に、ご親切に回答して下さって、感謝します!!

投稿: 潤樹 | 2016年3月28日 (月) 22時57分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217974/63354949

この記事へのトラックバック一覧です: 未来永劫 aaa で激怒。:

« アウトライナで勝手に検索フィールドがアクティブで激怒。の続き。 | トップページ | scriptJob で複数行。 »