« 2017年6月 | トップページ | 2017年9月 »

2017年7月

2017年7月 4日 (火)

ダブルクォーテーションの中にダブルクォーテーション。





すっかり忘れていて、こんなくだらないことで2~30分あたふたしてしまった orz



久しぶりに userSetup.mel をいじったんですが、つまり、Maya さまを起動するときに走らせるスクリプトをいじったんですが、愛用中の UnitBusUI がなぜか自動で起動されなくなっちゃった。


なにやら、UnitBusUI を呼び出すコマンドが、Maya の UI がロードされる前に実行されるようになってしまったように見えたので、以前も試した evalDeferred を使って実行を遅らせてみたら、 ちゃんとロードされました。



今までは userSetup.mel の中で

UnitBusUI;

とだけ書いていて問題なかったのに、起動されなくなっちゃったので、

evalDeferred "UnitBusUI";

と書いてみたら、うまく起動するようになったということです。




ここまでは良かったんだが・・・・





次に comet script というやつをロードするために

source "cometMenu.mel";

と書きたかったんだが、やはり実行を遅らせないとダメなようで、同じく evalDeffered を使おうとしたんですが、この evalDeffered コマンド、引数に与えるコマンドをダブルクォーテーションで囲まないといけないのですね。


そして今回引数として与えるコマンドは source コマンドで、これまたダブルクォーテーションで囲った引数が必要なコマンドです。


つまり、ダブルクォーテーションで二重に囲う構造になるわけで、あれれ? こういう場合、ダブルクォーテーションをどうやって記述するんだっけ? というのであたふたしてしまったのです。


evalDeferred "source "cometMenu.mel";";

これじゃダメなんですね。 どちらかの囲いをシングルクォーテーションにしてもダメだし、カッコにしてみてもダメだった。






で、ちょっと調べたらすぐ分かりました。  MEL でダブルクォーテーションを二重にしたい場合は、 囲われる内側のダブルクォーテーションの前に \ (バックスラッシュ・円記号)を付ければよかったんですね。


evalDeferred "source \"cometMenu.mel\";";
このように書けばよかったという。

そうなのね。 MEL はそういう文法なのね。はい分かりますた。




ほんとそれだけの話なんですが、半年後以降とかにまた同じ問題が起きて、対処を忘れて、あたふたと2~30分も狼狽する自分の姿が非常にクリアに脳内レンダリングできたので、ここにメモしただけです。 すぐ忘れちゃうからなあ。 自分のブログにメモすると、ほんと助かってるw  ありがとう過去の俺。  っていうか1回で覚えろ現在の俺。







UnitBusUI 便利です。 スクリプトランチャメニューですね。
UnitBus さまありがとうございます。 毎日使ってます。



.

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

2017年7月 3日 (月)

選択中のオブジェクトからコンストレインを取得。したい。

ちょっとしたスクリプト書くにも、もうヒーヒー言ってますよ。いまだに。
調べても、これぞ!ってのがすぐ見つからないんだよなあ。




コンストレイン関係のスクリプト、XSI 時代にもさんざん書いたので、自分の仕事を楽にするためにちょっとしたものを色々書きたいんです。



まずは最も基本、 「このオブジェクト、コンストレインされていたら、そのコンストレインを取得せよ」 ってのをやりたいんですが、 こんなんでいいのでしょうか?



Python:
---------------------------------------
import maya.cmds as mc
sel = mc.ls(sl=1)
for obj in sel:
    constraints = mc.listConnections( obj + '.parentInverseMatrix[0]',type="constraint" )
    if constraints == None: print( obj + " -- no fuckin' constraints on this.")
    else:
        for cns in constraints:
            print( cns  + " -- cns type : " + mc.nodeType(cns) )
---------------------------------------

ほとんど根拠ないです。 ひと様のスクリプトを見たり、今まで教えてもらったりしたことを元に、こう書いてみたら、一応ちゃんと動いているように見えるというだけです。 オブジェクトを選んで実行すると、そのオブジェクトが誰かにコンストレインされていた場合、そのコンストレインおよびコンストレインの種類を表示するというものです。



これで合ってますか?
詳しいお方、是非突っ込みを入れてくれませんか?
コンスト取得したいなら、それじゃおかしいよ、とか。
こうやった方がいいよ、とか。






constraints = mc.listConnections( obj + '.parentInverseMatrix[0]',type="constraint" )

↑ ここが特によく分かってません。

xxx.parentInverseMatrix[0] ってのが、ほんと、コピペしただけで全然意味がわかってない。コンストレインの取得にはこういう風に書くんだとかって、どっかマニュアルとか誰かのブログに書いてありませんでしょうか? [0] はなんで 0 番目なんでしょうか。 1 じゃいけないんですか。

根拠ないコピペじゃ、ここから発展させてツールを書くのが非常に厳しいですからね。 ちゃんと理解したいなあ・・・・。






試しに、意味がわかってない parentInverseMatrix[0] を取っ払って

constraints = mc.listConnections( obj, type="constraint" )


このように書いてみたんですけどね。このオブジェクトの、コネクションをチェックしろ。コンストだけな。 って感じでパッと見は合ってそうに見えてしまう俺はどシロート。


で、ポイントコンストレインを1個だけ持っている(コンストされている)オブジェクトを選んで実行した結果がこれです。 ↓

Cns

なんで6個・・・・?

1個のポイントコンストレインを持つオブジェクトなんですが、listConnection コマンドの結果は6個も返ってきています。しかも名前は全部同じ。 意味がわかりません。


最初のスクリプトなら、ちゃんと1個だけのコンストレインが返ってきます。 ためしに同じオブジェクトに、例えばペアレントコンストレインも与えると、ポイントコンスト1個、ペアレントコンスト1個の合計2個がちゃんと返ってきます。 


だから、意味不明の parentInverseMatrix[0] がなにやらいい仕事をしてくれているようですが、意味が分かってないゆえに、ある場合ではエラーになっちゃったり、そしてその原因を突き止められなかったりしそうです。 だから意味を知りたい。



こういうの、どっかに説明書かれてませんか?
Maya でバリバリいろんなツールを書いているお方、どこでどうやって調べたのですか? 
教えて下さい m(_ _)m











大昔、XSI でスクリプトを書き始めた時も、大いに苦労したんだよなあ。日本語の情報はまずないので、海外のユーザフォーラムに入り浸って、がんばって英語で質問書いたりしてたんだよなあ。  今もそれをやればいいのか?  AREA のフォーラムとかで質問すれば、丁寧に教えてくれる人もいるかな?


この数年で、数回はそんなことしたこともありますが、あんまり丁寧には教えてもらえなかったなあ。 「そんなのスクリプトでやる必要ない。メニューのここを選べば一瞬でできる」 とかね。 いや、そういう問題じゃないから!  ミス防止のための自動化ツールとか大量処理のツールを作りたいんだから、GUI から操作する方法を知りたいわけじゃないの! みたいなこともよくあったw  「MEL 書けば簡単にできるよ」 くらいの話で終わったり。 簡単なら書き方教えてよw  っていうか書いてよw

大昔の XSI ユーザフォーラムは、すんげえ助け合い精神があったので多くの人が教えてくれたり助けてくれたりしたものですが、この数年 Maya でそれをやろうとしても、あんまり反応良くなくてくじけそうになりますねw  また頑張ってトライしてみるか・・・・英語読んだり書いたり、すんげえ時間かかるんだよなあ。







.

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

« 2017年6月 | トップページ | 2017年9月 »