« 2016年2月 | トップページ | 2016年4月 »

2016年3月

2016年3月18日 (金)

scriptJob で複数行。

なんのことはないメモです。


scriptJob の話 を書いたことがありますが、 userSetup.mel とかに記述しておいて、シーンを開くたびにこのスクリプトを実行しろ、とかやるやつですね。


で、今日、ちょっと困りましてね。 Maya を起動した時に、自分で使いやすいように毎回やる操作ってのがあるわけで、そういうのを scriptJob に記述して自動化したいわけですが、1行で済むコードの場合はダブルクォーテーションでそのコードをくくればいいだけでした。 でも複数行に渡るようなコードの場合は、どう書くんだろう? という疑問が出てきましてね。


で、scriptJob のヘルプを見たら、例文として載っていたので、これでいいんだろうな、上手く行っているように見えるな、というメモです。



これは俺の userSetup.mel の一部なんですが、

Sjmultiline_2


上の方は、1行で書けるコードですね。 シーンを開くたびに Infinity をオンにしろ、とか書いてあります。前の記事で書いたやつです。


その下、緑色の印で囲ってある部分が、今回書いている 「複数行の場合」 ですね。 なんのことはない、global proc でプロシージャを宣言してそのプロシージャを呼べばいい、というだけのことのようでした。 これで上手く行っているように見えます。


1行の場合は、ダブルクォーテーションで囲って、その中にコードを書きますね。 複数行の時は、ダブルクォーテーションの代わりにプロシージャ名を書いておき、そして同じ userSetup.mel の中でそのプロシージャを記述しておく、ということですね。 同じファイル内にプロシージャつまりサブルーチンを書いておいてそれを呼び出している、ということですね。 サブルーチンは何行に渡って書いても良いわけですね。 うん。これでいいんじゃねえの。

誰かに聞いたわけでもなく、やってみて、なんか大丈夫そうというだけのアレですので、突っ込みがあれば是非お願いします。







余談ですが上記の例では、新規シーンを開くたびにカメラの farClipPlane を 1000000 に変えろというプロシージャを書いてますね。 今やっている仕事が、シーンの広さがかなり広くて、Maya さまのデフォルトの farClipPlane の 10000 じゃ範囲外になってしまってシーン全体が見えないんですよ。 なので新規シーンとかやるたびに、いちいち全カメラの farClipPlane の値を入力し直していたんです。 これがめんどくさくて、自動化したかった。 全カメラってのは、Top や Side など主に ortho カメラです。



っていうかね、シーンが広いと、pers カメラや自分で作成した普通のカメラで far clip plane を超えて見えなくなってしまうのは分かるんですが、なんで ortho カメラからも見えなくなってしまうんですか Maya さま? これ、すんげえ扱いづらいじゃないですか。  

ortho つまり Top や Side とかのカメラですよ。 これ、普通はレンダリングに使うカメラじゃなくてね、シーン全体の様子を把握するためにある 「神の視点」 的な特殊なカメラなんだから、シーンの広さに関係なく、常にシーン内のオブジェクトを表示して欲しいわけですよ。 でも ortho カメラには 10000 などという far clip plane が設定されていて、そしてそのカメラは 20000 の高さにあったりする。 20000の高さで far clip が 10000 だから、地表近くにある 10000 以下の大きさのオブジェクトはもう、見えなくなってしまうわけですよ。 だからわざわざ far clip をいじる必要が出てくる。そしてそれを自動化するために、scriptJob とかなんとかやらなければいけなくなる。 なんなんですかね。もう。

XSI 村にある Top や Side などの ortho カメラは、シーンの大きさによってブツが見えなくなるということはありませんでした。常に見えていました。 それが普通に使いやすい状態だと思います。 Mayaさまは頭おかしいです。 うそです Maya さまごめんなさい。






あ、関係ないけど、おらの田舎でちょっと謎に思っていたこと・・・

Xsicamfarplane

これは ortho ではなく、通常のレンダに使うようなカメラのデフォルト値ですね。 Far Plane が 32768。 うん、この数字は昔から疑問に思っていたんだ。  32768 ってずいぶんキリがいいですねw なんの数値ですかw  


いや、きっと意味というか由来があるんだろうけどねw





.

| | コメント (2) | トラックバック (0)

2016年3月16日 (水)

未来永劫 aaa で激怒。

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


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

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

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



Aaa


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


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

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

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

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



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


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



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



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



.

| | コメント (6) | トラックバック (0)

2016年3月 8日 (火)

アウトライナで勝手に検索フィールドがアクティブで激怒。の続き。

アウトライナを MEL で作成すると、いくつでも作成できる代わりに、なぜか検索フィールドがアクティブな状態になって表示されやがるので激怒しますという話を前回書きました。  解決するには、アウトライナウインドウを作った後にそのウインドウを setFocus コマンドでアクティブにしてあげれば、とりあえず検索フィールドのアクティブは外れるよ、と教えてもらった話でした。


↓このように書けばよいと。

--------------------------------------------

window -t "Outliner" fuckinOutliner;
frameLayout -labelVisible false -h 400 -w 280;;
string $panel = `outlinerPanel`;
string $outliner = `outlinerPanel -query -outlinerEditor $panel`;
showWindow;
setFocus fuckinOutliner;


----------------------------------------------


しかしその後、問題が発覚しました。

このやり方だと、アウトライナが複数開けない


↓こんなエラーが出てしまいます。

// Error: line 1: Object's name 'fuckinOutliner' is not unique. //

あ~ そうか、ウインドウの名前を fuckinOutliner などとハードコーディングしちゃってるからですね・・・。 この名前でウインドウを作っちまうと、閉じない限りその名前でウインドウが存在するわけで、そして2個目以降も同じ名前でウインドウを作ろうとするからユニークネームにならず、エラーになるんですね。 なるほど・・・・ 勝手に1とか付けて解決してくれないのですね Maya さま。

ん~ これじゃ意味無いですね。そもそも、Mayaさまのインターフェースから普通にアウトライナを出すと、1つしかできないというのが元々の問題ですからね。 スクリプトでやれば複数いけるよ、ということでわざわざこんなスクリプト書いているわけですからね。 検索フィールドのアクティブ問題が解決したのはいいけど、アウトライナが複数開けなくなっちまったんでは、本末転倒ですからね。

ってことで、またおじさまに相談したのですが、いつものように一刀両断あっさり解決。  なるほど、ウインドウの名前をスクリプトに書いてしまわずに、window コマンドの戻り値を使えばいいんですね。

--------------------------------------------
{
string $w = `window -t "Outliner"`;
frameLayout -labelVisible false -h 400 -w 280;;
string $panel = `outlinerPanel`;
string $outliner = `outlinerPanel -query -outlinerEditor $panel`;
showWindow;
setFocus $w;

}
----------------------------------------------

なるほど~ window コマンドの戻り値(ウインドウの名前)を変数に格納しておいて、あとで setFocus する時にこの変数を指定してやればいいわけですね。 なるほど~

※ 追記 { } を足しました  これあったほうがいいね。スコープっていうの? 変数の有効範囲が{ } に限定されるから、他のスクリプトと競合しなくていい。

なんか俺、いまだに mel の戻り値がよくわからんのですよ・・・・そのアクサングラーヴっていうの? ヘンな記号で全部囲うと戻り値が得られるんですよね。 いつもピンと来てないなあ・・・。 window コマンドの場合は、なるほど、ドキュメントを見ると、ウインドウの名前が戻り値になると書いてありますね。

http://help.autodesk.com/cloudhelp/2015/ENU/Maya-Tech-Docs/Commands/window.html

うーん、いつまで経っても慣れねえな・・・・ もっと書かないとダメだよなあ。 書いて書いて書きまくって自分用に調教するのが、Mayaさまと生きていくための唯一の道だと思う。


あるいは Maya さまを使わないというのが、Maya さまと生きていく道なのかも知れない。使わなければいいんだ。 Mayaさまがそこに居て下さってもかまわない。使わなければ。




ともかくこれでアウトライナをいくつでも出せるし、かつ検索フィールドがファッキンアクティブになってしまうという問題も解決できました。 調教がまた一歩前進した。 わーい

Fuckoutliner

| | コメント (0) | トラックバック (0)

« 2016年2月 | トップページ | 2016年4月 »