カテゴリー「Maya様 Scripting」の15件の記事

2017年10月12日 (木)

ヂョイントの Xray をオンオフしたかっただけなんだ俺。

.



fuckinToggleXrayJoint.mel
-------------------------------------------------------

string $panel = `getPanel -wf`;

modelEditor -e -jointXray ( !`modelEditor -q -jointXray $panel` ) $panel;

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

アクティブなビューの、ヂョイントの Xray 表示をオンオフするスクリプト。 

これ書くだけですげえ疲れた。 っていうか書いてすらいない。ほとんどコピペです。ネットからのパクり。








今に始まったことじゃないけど、Maya さまでは、ちょこっとしたスクリプト書くのがすんごくつらいですね。


ジョイントの Xray 表示のオンオフをホットキーに割り当てたかったのですが、ホットキーエディタにそれらしきコマンドが見当たらず、やむを得ず自前でスクリプトを書いてそれをランタイムコマンドにしホットキーを割り当てる、っていういつものやつをやろうとしたんです。




そしたらドツボにはまって、やたら時間かかっちゃった。




ログをサッとコピペしてはい終了、みたいな XSI 風のスクリプトの書き方は、できないんですかね Maya さまは。  

操作しても何もログされなかったり、 Echo All Commands をオンにすると、なんかこう、UI のパネルの名前とかズラズラ出てきて、やたら長く、なんというか、直球コマンドではない。 そして何より、コピペしても動かない orz 



だって、ジョイントの Xray 切り替える操作のログが、これですよ↓

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

modelPanelBarXRayCallback("XRayJointsBtn", "MainPane|viewPanes|modelPanel4|modelPanel4|modelPanel4", "MainPane|viewPanes|modelPanel4|modelPanel4|modelEditorIconBar"); restoreLastPanelWithFocus();

updateModelPanelBar MainPane|viewPanes|modelPanel4|modelPanel4|modelPanel4;

dR_setModelEditorTypes;

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


わ~~ 

長いね! 
複雑だね!




長くても、複雑でも、そのままコピペでとりあえず動いてくれるならいいんだけどね、

動かないんだよね(^∀^)ゲラゲラ 

今やった操作のログを、そのまま実行しても、動かないログ(^∀^)ゲラゲラ 

士んで下ちい Maya さま。



動かないっていうか、エラーは出ないけど、変化は無いんだよね。 UI から操作した、その操作の記録というだけで、Maya 様にどういうコマンドを送ったかというログではないのですかね?




結局 whatIs コマンドとかでコマンドなのかプロシージャなのかとか調べたり、プロシージャが記述されている mel ファイルに深く潜って中身を調べたりとか、やってらんねえっス。  whatIs とかもう、なんなんですか。 Hey, what is whatIs?    I said what the fuck is whatIs,  Maya さま??


Maya さまの国のお方はこれが普通なのでしょうが、俺のようにあの村で育った人間はもう、それはそれはもうだらしない人間でしてね、ほとんどの操作は明確にログされ、そのほとんどがネイティブコマンドなので直接ドキュメント参照できるし、あっちのファイルやこっちのファイルに記述されたプロシージャをぐるぐるぐるぐる巡る必要なんてないし、ほとんどそのままコピペでとりあえず動いちゃうもんだから、すっかり堕落してしまったのです。




結局、こんなちょっとしたことで大調査になってしまい、やってられるかとモニタを窓から射出し、ドキュメントや mel ファイルを読むのをあきらめ、ネットで安易に検索したら安易に見つかって、ほんの一部だけ書き換えたのが冒頭のスクリプトです。






俺の調査の苦労は意味なし。
今度からすぐネット検索することにしよう。







.

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

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)

2016年12月15日 (木)

タイムスライダの選択領域を取得。

Maya のタイムスライダで、現在選択されている領域のスタートフレームとエンドフレームを取得したかったんです。 のメモ。


↓ これです。 この赤い領域のフレーム範囲が欲しい。

Mayatimeslider




MELバージョン:
$rangeArray = `timeControl -q -rangeArray $gPlayBackSlider`;
print ( "MEL ver : すたあと: " + $rangeArray[0] + "  えんど:" + $rangeArray[1] );

こういうことらしい。 timeControl コマンド-rangeArray フラグをオンにすると、結果が array として得られるんですね。 array の 0 個目がスタートフレーム、1 個目がエンドフレームということですね。 gPlayBackSlider というのが、UI 上のタイムスライダを表している、ということなんでしょうね。


Mayatimesliderstartendmel


こうやればできるよ、と人に教えてもらっただけなので、あとはもう、マニュアル見たり、実行した時の挙動を見て理解していくしかありません。いつものパターンですね。 これで合ってますか? 何か間違いがあったらご指摘ください。






Pythonバージョン:
import maya.cmds as mc
import maya.mel
aPlayBackSliderPython = maya.mel.eval('$tmpVar=$gPlayBackSlider')
rangeArray = mc.timeControl( aPlayBackSliderPython, q=True, rangeArray=True)
print ( "Python ver : すたあと: " + str(rangeArray[0]) + "  えんど:" + str(rangeArray[1]) );


うーむ、これでいいのかなあ・・・・。 一応、望んだ挙動にはなっています。 ただ、eval とか使ってる3行目が、なんかわかりにくいというか、美しくないというか、気に入らないですよねえ。 タイムスライダの取得ってこんな風にやるしかないのでしょうか? このコードは、マニュアルに載っていたものをただパクっただけです。 

http://help.autodesk.com/cloudhelp/2017/ENU/Maya-Tech-Docs/CommandsPython/timeControl.html

一番下の、サンプルコードの中からパクりました。 グーグルで検索してみても、どうやらみなさんこの書き方をしているように見えなくもない。 うーん、なんか美しくない気がする。 もっといい書き方があれば是非教えて下さい。




俺にこの timeControl コマンドを教えてくれた人から、「スタートとエンドを取得していったい何をするの?」 と聞かれましたが、そりゃもう、いろいろです。 独自のお作法・手順を盛り込んだ自作 PlayBlast スクリプトを使うこともあるんですが、時間選択範囲だけを PlayBlast したい時とかね。 あとは、単純に、選んだ領域をシーンのプレイバックのスタートエンドに一発で設定したいとかね。 独自のアニメーション Bake スクリプトなんかにも使えそうですね。色々です。





.



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

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月 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月21日 (日)

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

アウトライナを複数出したくて、色々方法はあるみたいですが、俺はスクリプトでやってます。


こんな感じの mel です。

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

これをホットキーに割り当てて起動すれば、フローティングのアウトライナがいくつでも開けますね。 


そもそも、普通にインターフェース上からアウトライナを開こうとすると、tear Off copy しない限り同時に1つしか開けないという仕様がアフォなんですがね Maya 様。 しかも、2つめのアウトライナを開こうとすると、エラーを出すとか何も起こらないとかいう挙動ならまだマシなんだけど、そうではなく、こともあろうに今まで開いていたアウトライナを別のビューとかに勝手に切り替えやがるんですよね。 俺の作業レイアウトを壊さないで下さい Maya 様。 っていうか今すぐ氏んで下さい。



でもまあ、上記のようにちょっとスクリプト書けばできるんだから許します。




ただね、このスクリプトで起動したアウトライナには問題がひとつあってね。 起動後、アウトライナ上の検索フィールドが勝手にアクティブになっているんですよ。 

Fuckol1

なぜ? そこを勝手にアクティブにする意味わかんないです Maya様。 しかも、普通にメニューから選んだアウトライナや、Tear Off Copy したアウトライナはそんなことないんですよ。 スクリプトで起動したときだけ、検索フィールドがアクティブになってるように見えます。意味わかんないです Maya様。


これがどう困るのかというとですね。 アウトライナを出した直後って、現在選択中のオブジェクトにジャンプするために、f キーを押すこと多いじゃないですか。 しかしこの f キーの入力は、現在アクティブになっている検索フィールドの中に行ってしまうわけです。 つまり選択中のオブジェクトにジャンプするのではなく、f という文字列を検索したことになっちまうわけです。

Fuckol2


もうね、この f は fuck の f ですね。 ファックしやがってください Maya様。 このファッキンディックレスアスホール野郎。


分かっちゃいるけど何度も繰り返してしまうこのミスオペレーション。このため、スクリプトでアウトライナ出した直後はまずどこかをクリックするみたいな、ヘンな手グセが付いてしまって来ているよ俺。 俺の手にいやらしい習慣を刷り込まないで下さい Maya様。





という相談を、いつものように空調屋のおじさまに持ちかけてみたところ、嘔吐デスクに質問してくれて、そしたらこんな答えが返ってきた。


スクリプトにちょっと書き足してください、と。
--------------------------------------------
window -t "Outliner" fuckinOutliner;
frameLayout -labelVisible false -h 400 -w 280;;
string $panel = `outlinerPanel`;
string $outliner = `outlinerPanel -query -outlinerEditor $panel`;
showWindow;
setFocus fuckinOutliner;
----------------------------------------------

これを実行すると、

Fuckol3

よしゃー 検索の入力フィールドのアクティブ外れたー

それでいいんだ 苦労かけやがって Maya様


アウトライナを出現させた後、そのアウトライナのウインドウ全体を setFocus でアクティブにすることによって、検索フィールドのアクティブを解除する、という方法なのですね。 苦しいですね Maya様wwwww  最初から、謎の検索フィールドアクティブをやめればいいじゃないですかwwwww 


なんでそういう風に作っちゃったのかなあ。 いや、意図はしてないんでしょうねおそらく。 他の何かの都合で入力フィールドをアクティブにするように書いたコードを、アウトライナのコマンドが起動されたときも呼ばれるようになってしまってこうなった、とか、そういう感じ? どうでしょうね。


ま、なんとかなったんだからよしとしますけど、
これ、嘔吐デスクの公式な回答ですからねw
苦しいw
フラッグシップソフトウェアでしょ。
ヒーローソフトウェアでしょ。
他の村を廃村にしてこれ1本で行きたいんでしょ。

なんかこの苦しい感、可愛くなってきちゃいそうで困るw




追記:
この書き方だとアウトライナが複数開けないことが判明しますた。 解決方法を新たな記事に書きますた。

.

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

2015年7月 1日 (水)

起動時にスクリプトを実行して下さい。の改良。scriptJobで行こう。

前に書いた記事2つ、やはりまだ不具合があるわけですよ。



起動時にスクリプトを実行して下さい。っていうか設定記憶して下さいMaya様

↑ この記事では userSetup.mel に mel スクリプトを記述すればいいらしいぜ、という話でした。 グーグル検索して分かったことを再メモしただけですね。


で、userSetup.mel に記述するんだぜという話自体には何も問題はなかったのですが、問題が出たのは、この記事の中で、グラフエディタの Infinity をオンにするということをやった後ですね。 

Maya様は、グラフエディタで Infinity の表示をオンにしてるのに、起動するたびにこれを勝手にオフにしやがるので(2015以降では記憶してくれるようになったそうです)、ならば起動するたびにスクリプトを実行してオンにしてやれと思ったわけですよ。 ということで、Infinity をオンにするスクリプトを userSetup.mel に書きました。

しかしここで問題発生。 Maya 起動直後、まだ UI がロードされてないタイミングでこのスクリプトが実行されているらしく、「グラフエディタで Infinity をオンにしろ」 というスクリプトを書いても 「グラフエディタなんてものはねえよ(まだロードされてないから)」 というアフォな事態が起こっていたようなのですね。



そこで、ちゃんと UI がロードされるまでスクリプトの実行を待ってもらおうということで、evalDeffered コマンドというものがあるということが判明したので、書きました。 

それがこの記事 ↓

ちょっと待ってから実行。


これで解決したかのように見えました。


・・・・しかし、また問題が・・・・


これ、確かに起動時は Infinity をオンにしてくれるわけですが、起動時だけなんですね。 その後、新規シーンを実行したり、既存のシーンを開いたりすると、Maya様はまたご親切にも Infinity をオフにしやがって下さるのですよ。 本当に毎回毎回、懇切丁寧にありがとうございます Maya 様!! \(゚∀゚)\


ということで、起動時にどうこうするというのは忘れて、新規シーン実行時、あるいは既存のシーンを開いた時にスクリプトが実行される方法を探ったのです。 XSI ではセルフインストール型のスクリプトに event を記述すればできますね。 これに相当するものを探していたのです。


そしたら偶然それを見つけた気がしまして、なじみの空調屋さんに検証をお願いしちゃったりして、なんとか解決した気がするというのが本記事です。 ああ前振りがなげえ。


ってことで、scriptJob コマンド です。

「新規シーンの時に、このスクリプトを実行」 「既存シーンを開いたら実行」 「選択しているオブジェクトが変わったら実行」 みたいに、指定したイベントが起こった時にスクリプトを実行させるものですね。 これを userSetup.mel に記述します。 そしたら、起動後、新規シーン後、既存シーン開いた後、全ての状態でちゃんと Infinity オンに出来ました。やっとの思いで。 長い道のりだった。


Infinity をオンにするコマンドは

scriptJob -event "SceneOpened" "animCurveEditor -edit -displayInfinities true graphEditor1GraphEd;";

こうなりますね。


SceneOpened というイベントが検知された時、つまりシーンが開かれた時に、それに続く animCurveEditor コマンドが実行されるということになります。 

新規シーンの場合は、「空っぽのシーンという既存シーンを開く」 という考え方になるようで、この SceneOpened でカバーされます。つまり、SceneOpened とだけ記述しておけば、新規シーンの時も既存シーンのときも、続くコードが実行されます。

一方、SceneOpened の代わりに NewSceneOpened と書くと、新規シーンの時だけ実行され、既存シーンを開くときは実行されないので注意が必要です。



SceneOpened や NewSceneOpened 以外にどんなイベントがあるのかは、

scriptJob -listEvents;

を実行すればズラズラと出てきますが、まあ、ドキュメントにも全部載っている みたいだからそっち見たほうがいいのかな。

関係ないけど、mel で -listなんちゃら ってオプションで表示させる時って、結果が改行もされずズラズラと長ったらしく表示されますよね。 これわかりにくいです Maya 様。 いつもテキストエディタにコピペして、スペースを改行に変換するとかアフォなことをやっているのですが、なんかもっと簡単にパッと全体を見れる方法ないものですかね。





ってことでもはや evalDeffered コマンドも使いません。この scriptJob コマンドだけで上手く行っているように見えます。しばらくこれで運用してみます。

scriptJob いいなあ。 XSI のイベントより遥かに手軽ですね。 XSI の方はセルフインストール型で記述することによってただのスクリプトではなくプラグインとして認識させて云々みたいな知識が必要だけど、Maya様のこれは、俺みたいにほとんど分かってない人間でも、こんな簡単な1行を書くだけで一応は出来ちゃうっぽい(分かってない故の落とし穴がたくさんありそうだが・・・)。 さすが Maya様です。ありがとうございます。





ちなみに Infinity だけじゃなく Buffer Curve も起動するたびにオフにされてしまうので、同じく scriptJob コマンドでオンにしてあげてます。

scriptJob -event "SceneOpened" "animCurveEditor -edit -showBufferCurves true graphEditor1GraphEd;";



あと、俺の Maya 様は、HeadsUp Display でワールド原点に軸が表示されちゃうんだよなあ。これデフォルトでこうでしたっけ? 邪魔なので、それをオフにするコードも scriptJob でやってます。

scriptJob -event "SceneOpened" "toggleAxis -o off;";



このように、起動時やら新規シーン時やら既存シーンを開いた時やらにやって欲しいことは全部、scriptJobコマンドで userSetup.mel にズラズラと記述してしまえばいいと思います。多分。




SelectionChanged イベントは、どうでしょう、重くならないかな。選択しているオブジェクトに変化があるとトリガになるわけですが、これも色々便利に使えそうですが、XSI でこれに相当することをやるとけっこう重くなってたんですよね。 選択状態を常に監視するわけですから、バックグラウンドに常駐してある程度プロセッサの処理を食ってしまっている的な感じでした。 今度 Maya 様でもやってみよう。



.

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

2015年6月 2日 (火)

俺のキー 淫サートキーフレーム

挿入したいんです。 淫サートです。



アニメーション作業中はグラフエディタ上で多くの時間を過ごすわけですが、その中でも、既存のアニメーションカーブにキーフレームを挿入するってのは実に頻繁にやる操作でして、Maya の標準のやり方だとちょっとだけ気に食わなかった。ちょっとだけね。

だからスクリプトを書いてみたんですが、別にどうというアレでもありません。ただの小スクリプト。



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

//    俺のキー 淫サートキーフレーム
//    選択中のアニメーションカーブの現在フレームに
//    キーフレームを挿入し、そのキーフレームを選択状態にする
//    そんだけ。

OrenoKeyFrame_Insert();
global proc OrenoKeyFrame_Insert()
{
    string $selectedAnimCurves[] = `keyframe -q -selected -name`;
    if ( size($selectedAnimCurves) ) 
    {
        setKeyframe -insert $selectedAnimCurves;
         
        float $currentTime;
        $currentTime = `currentTime -q`;
        selectKey -clear;
        selectKey -time $currentTime $selectedAnimCurves;
    }
}

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

OrenoKey_InsertKeyframe.mel


アニメーションカーブを選択して実行すると、そのカーブの現在フレームにキーフレームを挿入します。 そしてそのキーフレームを選択します。 そんだけ。 ほんとそんだけです。

Insertkey1

この 挿入したキーを選択 という状態になっていた方が俺には都合が良くてね。大抵の場合すぐにいじるのでね。 大量にアニメーションするので、こういう小さいことが意外と影響大きいわけですよ。 ホットキーに即登録しました。  選択状態にしたいというのもあるけど、実はこの 「ホットキー化したい」 というのが今回の一番の目的かもしれないw  以下の方法だとホットキーにできないんですよね。




Maya に元からある標準の方法だと、アニメーションカーブを選択した状態で、右クリック > Insert Key がありますよね。

Insertkey2

これでも全然いいんだけど、挿入したキーを選択してくれないんだよなあ。 それと、やはり右クリックはちょっとつらい。 マウスならいいけど、俺は大抵ペンタブ使うから。 それと、この右クリックからの操作は、ホットキーが割り当てられないと思うんだよな。 違います?



あと、Insert Key Tool というのもありますね。 グラフエディタの Keys メニューからアクティブにしてもいいけど、i キーを押しっぱなしにして中ボタンでドラッグしても同じですね。 i キーを押している間だけ Insert Key Tool がアクティブになる感じでしょうかね。 挿入するフレームを表す黄色い線が出て来ますね。 

Insertkey3

そしてこのやり方だと、作成したキーを選択してくれる! なかなか良いのですが、中ボタンなんですよねー ペンタブだと、中ボタンドラッグとかほんとにつらいのよ。 そこが惜しいんだよなあ。 それに、ドラッグ操作が必要で、ホットキー1発でキー挿入というオペレーションにはならないからなあ。



あと、Add Key Tool ってのもありますね。

Insertkey4

このツールも中ボタンか・・・・・

しかもこのツールは、XSI の Edit Key Tool だっけ、 shift + E のやつね、あれと違って既存のキーを動かすことは出来ないんですね。 XSI のやつは、左クリックなら既存のキーを移動できるじゃないですか。そして中ボタンではキーの挿入。 Maya のこのツールは、挿入以外の操作はできません。 うーむ、いかんな・・・・・ XSI のアレを移植してくれませんか嘔吐デスク様。 XSI を抹殺したんだからそれくらいやって下さいよ嘔吐デスク様。 

ついでに左ボタンでも挿入できるようにオプションを付けてくれないかなあ。 まあ、XSI のように左クリックが既存のキーの移動になるなら、挿入は中ボタンのままでいいけどね。




これ以外に、グラフエディタ上でのキーフレームの挿入って、方法ありますでしょうかね?





ともかく、上記の方法でちょっとしっくり来てなかったので、四苦八苦して mel 書きますた(いつものように、空調屋さんに助けて頂いてます。空調屋さんのサポート無しには生きて行けません)。 こんだけの mel で四苦八苦どころか十六苦三十二苦くらいですよ俺は。 慣れないなあこの mel の書き方というか考え方が・・・・。 

だって、 setKeyframe コマンドの戻り値は、セットされたキーフレームの だそうですよ。 数かよ。 セットされたキーフレームをオブジェクトとして、そのコレクションとして返してくれよなあ。 オブジェクトとしてキーが取得できていれば、最後に選択するのも簡単だし、他にも色んなことができると思うわけですよ。 

それと比べてこのスクリプトでは、新規キーを選択するために、キーの生成に使った setKeyFrame コマンドとは全く関係なく、「このアニメーションカーブの現在フレームのキーフレームを選択しろ」 というコマンドを書いています。 生成されたキーかどうかは関係ないんですね。 こんな風に、「続く何かをやろうと思ったら、前の結果や戻り値とは無関連の方向からまた取得し直す」 みたいな、この一方通行感がね、なんだかね。 

Maya人には、結果が同じだからそれでいいジャマイカと言われます。 オブジェクトモデルでスクリプトを書いた経験の無い方には、オブジェクトとしてブツが取得できて、そのメソッドやプロパティでいじっていく感じを伝えても、「それのどこが便利なの? mel の方式で何でもできるんだから、何も不自由ないじゃない?」 と言われてしまいます。 そうですか。そうですよね。 でもなあ、ひとつ端緒をつかめばそこから芋づるでオブジェクトを次々に取得できて、前の結果を活かして次の操作をするって、とてもロジカルだし便利だと思うんだけどなあ。コードの再利用性も高くなってると思うんだな。


って、プログラマでも何でもない俺が知った風なことを言うと、本職の人からすんげえツッコミが来そうなのでやめておこうw



ま、ホットキーも登録したし、これで思う存分挿入できるね
すっこんぱっこん入れるぞー






.

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

2015年5月30日 (土)

ちょっと待ってから実行。

先日書いた起動時にスクリプトを実行する云々の記事 なんですがね起動時にスクリプトが上手く実行されてませんでした。すいません


Maya を起動し直しても、Infinity がオフになったままなんですね。あれえ? ちゃんと効いてないじゃない? ダメねえ Maya さま。 

と思ってスクリプトエディタのログを見てみると、お前がコマンドの中で指定してるグラフエディタとかいうオブジェクトなんてねえんだよこのヴォゲ!  とかいうエラーが出てました。




どうやら、スクリプトが走った時点で Maya の UI がまだロードされておらず、グラフエディタと言われてもそんなもの無いから困る、ということみたい。


ってことで困ったときの空調屋さん。いつもお世話になります。


evalDeferred 
ってコマンドを使えばいいんですって。

http://download.autodesk.com/global/docs/maya2014/en_us/Commands/evalDeferred.html

なるほど、実行を延期するコマンドなんですね。

今回の場合、

evalDeferred "animCurveEditor -edit -displayInfinities true graphEditor1GraphEd";

このように書くと、animCurveEditor コマンドの実行を、Maya が起動し終わってアイドル状態になるまで待ってくれるようです。



ってことでこれで上手く行きました。わーい



よし、ついでに Infinity だけじゃなくてバッファカーブの表示オンも書いちゃおうぜ

evalDeferred "animCurveEditor -edit -showBufferCurves true graphEditor1GraphEd";

userSetup.mel にこの1行を追加ね。 これでいつでもバッファカーブを見れる状態がデフォルトになる。 良いじゃないですか。 ピシピシ調教してやるぜ Maya 様。






っていうかそもそもなんで起動するたびに設定忘れちゃうんですか Maya 様あなたやはり Baka 様ですか Maya 様


追記:
また不具合ありました。

解消方法 ↓ 
起動時にスクリプトを実行して下さい。の改良。scriptJobで行こう。

.

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