Locator ver.2
ロケータに機能追加。NURBSカーブを挿すことによって、入力カーブと同じ形状になるようにしました。
あと、無駄にテキストの表示機能w

今回のはMayaにサンプルでついてくるcvColorNode.cppを参考に(丸写し?)してます。
あとは、NURBSカーブの入力を複数持てるようにしたいのですが、複数入力のデータの保持がうまくいかず挫折・・・またサンプル探しの旅に出るか・・・最終的にはポリゴンも挿せるようにしたいところですが、まだポリゴンの描画はやってないから、まだだいぶ後ですかね。
ついでにロケータ用に、初めてアトリビュートエディタも作成(AETemplateね)。今までやったことなかったんで、最初大量にアトリビュートが出てきてビビりました。
隠したいアトリビュートは
え~、超面倒臭い。と思って本家ロケータを見ると、どうやら AElocatorCommon $nodeName;でlocalPosition、localScaleの表示を、AElocatorInclude $nodeNameで、その他大勢を綺麗にまとめてくれるようです。これはありがたい。
因みにAElocatorInclude $nodeNameは内部でAEgeometryShapeTemplateを呼んでるだけなんで、所謂ジオメトリ系(メッシュやサーフェースなど)を作った場合はこちらを使えば良さそうです。
また、Mayaはアトリビュートエディタを初回開くと、それをキャッシュしてます。なので調整中の時に自作AETemplateのMELをソースし直しても反映されません。
ちゃんと反映させたい場合は、ファイルをソース後
今更知りました・・・ryu先生、昔AE作成の時何度もMayaを再起動させてスイマセン。。。
まだ未完成だけど、とりあえずロケータを投入!

カスタムロケータは色や線の太さを自由に変えられるのがいいですネ。ってか何故標準でこう言う機能がついてないのでしょう。。。

以前、MayaAPIの説明会かなんかで、APIを簡単に使えば簡単に独自のロケータを作れますヨ~! なんて紹介してましたが、個人的にはAPIじゃなくて普通にGUIから作成できればいいんですけどね。
時間をみつけてもうちょっと拡張して行きたいところですが、MayaAPIって難しい・・・なかなか思うように作れないのがもどかしいです。
勉強あるのみじゃぁ!!
あと、無駄にテキストの表示機能w

今回のはMayaにサンプルでついてくるcvColorNode.cppを参考に(丸写し?)してます。
あとは、NURBSカーブの入力を複数持てるようにしたいのですが、複数入力のデータの保持がうまくいかず挫折・・・またサンプル探しの旅に出るか・・・最終的にはポリゴンも挿せるようにしたいところですが、まだポリゴンの描画はやってないから、まだだいぶ後ですかね。
ついでにロケータ用に、初めてアトリビュートエディタも作成(AETemplateね)。今までやったことなかったんで、最初大量にアトリビュートが出てきてビビりました。
隠したいアトリビュートは
// MEL - for AETemplate //Hide attribute from Attribute Editor. editorTemplate -suppress "attribute name"; //で隠せるみたいなんですが、数が多すぎる。。。
え~、超面倒臭い。と思って本家ロケータを見ると、どうやら AElocatorCommon $nodeName;でlocalPosition、localScaleの表示を、AElocatorInclude $nodeNameで、その他大勢を綺麗にまとめてくれるようです。これはありがたい。
因みにAElocatorInclude $nodeNameは内部でAEgeometryShapeTemplateを呼んでるだけなんで、所謂ジオメトリ系(メッシュやサーフェースなど)を作った場合はこちらを使えば良さそうです。
また、Mayaはアトリビュートエディタを初回開くと、それをキャッシュしてます。なので調整中の時に自作AETemplateのMELをソースし直しても反映されません。
ちゃんと反映させたい場合は、ファイルをソース後
// MEL refreshEditorTemplates; //を実行すればOK。ちゃんと更新してくれます。
今更知りました・・・ryu先生、昔AE作成の時何度もMayaを再起動させてスイマセン。。。
まだ未完成だけど、とりあえずロケータを投入!

カスタムロケータは色や線の太さを自由に変えられるのがいいですネ。ってか何故標準でこう言う機能がついてないのでしょう。。。

以前、MayaAPIの説明会かなんかで、APIを簡単に使えば簡単に独自のロケータを作れますヨ~! なんて紹介してましたが、個人的にはAPIじゃなくて普通にGUIから作成できればいいんですけどね。
時間をみつけてもうちょっと拡張して行きたいところですが、MayaAPIって難しい・・・なかなか思うように作れないのがもどかしいです。
勉強あるのみじゃぁ!!

スポンサーサイト
チャンネルボックスからいらないヒストリやシェイプを隠す
セットアップやらなんやらをやってコントローラを作っていると、当然コントローラからリグを経由してノードを動かすことになるので、様々なノードがコントローラにくっつきますよね。
で、コントローラを選択するとそのノードがチャンネルボックスから見えてしまって嫌ぁ~な感じになったりします。

↑の場合OUTPUTSにdecomposeMatrix3とか表示されてます。セットアップ的にも見た目ウザクて嫌だし、アニメータ的にも意味の無い表示なんで邪魔以外の何者でもないヤツです。
そこで次のアトリビュートを使うと、なんとこいつをチャンネルボックスの表示から消すことができるそうです。
これでスッキリ!!
他にもshapeノードの表示も消すことができるので、複数のshapeノードがいて邪魔くさい時なんかも重宝します。因みに元に戻すときは
あと、当然ですが表示から消えてるだけであって、実体がなくなってるわけではないのでpickup walk等で普通に選択できます。まぁ流石にこれは仕方ないですネ。
で、コントローラを選択するとそのノードがチャンネルボックスから見えてしまって嫌ぁ~な感じになったりします。

↑の場合OUTPUTSにdecomposeMatrix3とか表示されてます。セットアップ的にも見た目ウザクて嫌だし、アニメータ的にも意味の無い表示なんで邪魔以外の何者でもないヤツです。
そこで次のアトリビュートを使うと、なんとこいつをチャンネルボックスの表示から消すことができるそうです。
setAttr ノード名.ihi 0;

これでスッキリ!!
他にもshapeノードの表示も消すことができるので、複数のshapeノードがいて邪魔くさい時なんかも重宝します。因みに元に戻すときは
setAttr ノード名.ihi 2;です。デフォルトの値は1ではないので注意です。
あと、当然ですが表示から消えてるだけであって、実体がなくなってるわけではないのでpickup walk等で普通に選択できます。まぁ流石にこれは仕方ないですネ。
Maya2011 スクリプトアレコレ
Maya2011になって色々挙動や書式が変わって戸惑中のEskeです。
結構書き換えが頻繁に起こるので色々大変ですが、良くなってる部分も多いし、今後進歩する可能性はあっても昔に戻ることまず考えられないので、これからはMaya2011をベースにスクリプト作りしますかな。
しかし、クライアントによってはまだ2009や2010のところも多いので、2011専用で作ったら下位互換が無いのがネックか・・・割り切るしかねぇっすな。
今まではコールバックに文字列2つを受け取るグローバル関数を用意する必要があると言う、なんとも微妙な仕様だったのが、fileDialog2になってからは単純に選ばれたファイルが戻り値として返ってくるシンプルな仕様に変更されたため、非常に使い勝手がよくなってます!
これは素晴らしいアップデートだ。もうMaya2011以前には戻れん
従来だと-pフラグと-uidフラグでダブルで親を指定しても問題なかったのですが、2011からは-pフラグが優先されるように仕様変更されったぽいです。
今まで保険で-pと-uidで同じ親を指定してたのですが、2011からは-uidだけにしておかないと正常に動作しませんのでご注意。
pngファイルが使えるようになったのはかなりgood!
以前作ったツールなんかも、子供の大きさを指定していない場合結構大きめにMayaが自動で作成していたため、paneLayoutでサイズ変えても一定以下には変わらなかったのは、子供の大きさが原因だったみたいです。
その他、他にも気づいたことがあったような気がするんですが、忘れたんでまた思い出したときにでもメモっとこう。
結構書き換えが頻繁に起こるので色々大変ですが、良くなってる部分も多いし、今後進歩する可能性はあっても昔に戻ることまず考えられないので、これからはMaya2011をベースにスクリプト作りしますかな。
しかし、クライアントによってはまだ2009や2010のところも多いので、2011専用で作ったら下位互換が無いのがネックか・・・割り切るしかねぇっすな。
■fileDialog2
従来の使い勝手の悪いFileDialog、Linuxでは使えなかったFileBrowserDialog、Maya標準スクリプトととして使われていたけど使い勝手が微妙な気がしたFileBrowserに代わり、fileDialog2と言うコマンドが追加されました!!今まではコールバックに文字列2つを受け取るグローバル関数を用意する必要があると言う、なんとも微妙な仕様だったのが、fileDialog2になってからは単純に選ばれたファイルが戻り値として返ってくるシンプルな仕様に変更されたため、非常に使い勝手がよくなってます!
string $result[] = `fileDialog2 -cap "Sample" -okc "Open" -fm 1 -ff "Maya Binary(*.mb);;Images(*.tif *.tga *.psd *.iff)" `;FileFilterも従来の指定されたものしか指定できなかったものと違い、自分で好きなように拡張子のフィルタを付けることが出来るようになりました!
これは素晴らしいアップデートだ。もうMaya2011以前には戻れん
■scriptJob
こちらは-uidフラグの挙動が微妙に変わった模様。従来だと-pフラグと-uidフラグでダブルで親を指定しても問題なかったのですが、2011からは-pフラグが優先されるように仕様変更されったぽいです。
今まで保険で-pと-uidで同じ親を指定してたのですが、2011からは-uidだけにしておかないと正常に動作しませんのでご注意。
■iconTextButton
以前チラッと言いましたが、Linux同様ボタンを押してからやっぱ止めようと思ってボタンからカーソルを外して離してもキャンセル出来なくなりました・・・これからオラはどうすりゃいいんだ・・・?pngファイルが使えるようになったのはかなりgood!
■リサイズ
paneLayoutやウィンドウのサイズを変更した時、子供の大きさ以下にはならないようになったポイです。以前作ったツールなんかも、子供の大きさを指定していない場合結構大きめにMayaが自動で作成していたため、paneLayoutでサイズ変えても一定以下には変わらなかったのは、子供の大きさが原因だったみたいです。
その他、他にも気づいたことがあったような気がするんですが、忘れたんでまた思い出したときにでもメモっとこう。
Maya2011 - toolBar・dockControlコマンド編
前回の記事の後半でtoolBarとdockControlの紹介をしましたが、もう少しわかり易く説明するために、実際に運用してみました。
toolBar・dockControlコマンドとは、自作ウィンドウをMayaのメインウィンドウへ取り込んでくれると言う、今まで散々苦労して自作のパネルを組み込んできたGUI改造房は自殺したくなるようなコマンドですorz
さっそく実践・・・まずメインウィンドウに組み込む前に、自作ウィンドウを作成します。
凝ったのを作るのは面倒なんで、とりあえずアウトライナーを量産します。
作成されたアウトライナーにはそれぞれmyOutliner1~4と名づけています。

アウトライナー4兄弟ができました。
これに対し、まずtoolBarコマンドを適応してみましょう~

先ほど作ったアウトライナーズを、toolBarコマンドにて上下左右に配置してみました。
・・・がなんだか潰れてしまってよくわからないっすね・・・ここら辺の調整は色々試さないとダメそうです。
今度はdockControlを使 用してみましょう~

こちらはちゃんと左右のアウトライナーが表示されてますね! 上下は何やら潰れてますが、それは高さが足りないからでしょう。
dockControlの場合、位置はビューポートの上下左右のみしか配置できませんが、その代わりpaneLayoutのように境界線部分で自由にサイズ変更できます。
サイズ変更したのがこちら↓

アウトライナーに囲まれた生活・・・(*^Д^*)
またdockControlをドラッグすることによって、セパレートできます。

さらに、dockControlを同じ部位(この場合は下)にドラッグする事によって、タブ化されます。

こんなんが標準機能になる日が来るとは・・・素晴らしい。
これでさらにPyQTで細かいカスタマイズができると、夢が広がり過ぎて大変ですね~
toolBar・dockControlコマンドとは、自作ウィンドウをMayaのメインウィンドウへ取り込んでくれると言う、今まで散々苦労して自作のパネルを組み込んできたGUI改造房は自殺したくなるようなコマンドですorz
さっそく実践・・・まずメインウィンドウに組み込む前に、自作ウィンドウを作成します。
凝ったのを作るのは面倒なんで、とりあえずアウトライナーを量産します。
作成されたアウトライナーにはそれぞれmyOutliner1~4と名づけています。
{ for( $i=1; $i<5; $i++ ){ string $windowName = "myOutliner" + $i; if( `window -ex $windowName` ) deleteUI $windowName; string $myOutliner = `window $windowName`; paneLayout; outlinerPanel; showWindow $myOutliner; } }

アウトライナー4兄弟ができました。
これに対し、まずtoolBarコマンドを適応してみましょう~
{ string $area[] = {"top", "right", "bottom", "left"}; for( $i=1; $i<5; $i++ ){ string $myToolbar = "myToolbar" + $i; string $windowName = "myOutliner" + $i; toolBar -area $area[$i-1] -content $windowName -allowedArea "top" -allowedArea "bottom" -allowedArea "left" -allowedArea "right" $myToolbar; } }

先ほど作ったアウトライナーズを、toolBarコマンドにて上下左右に配置してみました。
・・・がなんだか潰れてしまってよくわからないっすね・・・ここら辺の調整は色々試さないとダメそうです。
今度はdockControlを使 用してみましょう~
{ string $area[] = {"top", "right", "bottom", "left"}; for( $i=1; $i<5; $i++ ){ string $myDock = "myDock" + $i; string $windowName = "myOutliner" + $i; dockControl -area $area[$i-1] -content $windowName -allowedArea "top" -allowedArea "bottom" -allowedArea "left" -allowedArea "right" $myDock; } }

こちらはちゃんと左右のアウトライナーが表示されてますね! 上下は何やら潰れてますが、それは高さが足りないからでしょう。
dockControlの場合、位置はビューポートの上下左右のみしか配置できませんが、その代わりpaneLayoutのように境界線部分で自由にサイズ変更できます。
サイズ変更したのがこちら↓

アウトライナーに囲まれた生活・・・(*^Д^*)
またdockControlをドラッグすることによって、セパレートできます。

さらに、dockControlを同じ部位(この場合は下)にドラッグする事によって、タブ化されます。

こんなんが標準機能になる日が来るとは・・・素晴らしい。
これでさらにPyQTで細かいカスタマイズができると、夢が広がり過ぎて大変ですね~
モディファイキー(ShiftとかCtrlとか)が押されてるかどうかを知る
たとえばpSphere1を選択するスクリプトを作成したとします。
しかしこれだと選択はできますが、選択解除やトグル、選択追加などを行う場合別のボタンを作成する必要がでてしまいます。
それはそれでいいのですが、Mayaの通常オペレーション同様
の仕様にすればボタンひとつで様々なアクションを行えるようになり、画面の節約にもなります。
そこで登場するのがgetModifiersコマンドになります。
なんとこのコマンド、CtrlキーやShiftキー、Escキーなどのモディファイアボタンと呼ばれるボタンが押されているかどうかを判別する事ができます!
Shiftが押されているならば1ビット(1)、Ctrlが押されているならば3ビット(4)、Altキーが押されていれば4ビット(8)といった具合です。因みにShit+Ctrlなら1+4で5が返ってきます。
例えばAltキーを押さえながら
getModifiers();
とスクリプトエディタで実行すると結果は8になる・・・みたいな感じです。
これを踏まえて上記スクリプトのselectSphere関数を次のように変更します。
これでMayaの選択操作と共通化できました\(^0^)/
global proc selectSphere() { select -r pSphere1; } { polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -cuv 2 -ch 1; if( `window -ex sampleWindow` ) deleteUI sampleWindow; string $win = `window -w 100 -h 80 sampleWindow`; columnLayout -adj true; button -l "Select Sphere" -c selectSphere; showWindow $win; }
しかしこれだと選択はできますが、選択解除やトグル、選択追加などを行う場合別のボタンを作成する必要がでてしまいます。
それはそれでいいのですが、Mayaの通常オペレーション同様
Shift + クリック | → | トグル選択 |
Shift + Ctrl + クリック | → | 追加選択 |
Ctrl + クリック | → | 選択解除td> |
の仕様にすればボタンひとつで様々なアクションを行えるようになり、画面の節約にもなります。
そこで登場するのがgetModifiersコマンドになります。
なんとこのコマンド、CtrlキーやShiftキー、Escキーなどのモディファイアボタンと呼ばれるボタンが押されているかどうかを判別する事ができます!
Shiftが押されているならば1ビット(1)、Ctrlが押されているならば3ビット(4)、Altキーが押されていれば4ビット(8)といった具合です。因みにShit+Ctrlなら1+4で5が返ってきます。
例えばAltキーを押さえながら
getModifiers();
とスクリプトエディタで実行すると結果は8になる・・・みたいな感じです。
これを踏まえて上記スクリプトのselectSphere関数を次のように変更します。
global proc selectSphere() { string $obj = "pSphere1"; int $mod = getModifiers(); switch( $mod ){ case 1: select -tgl $obj; break; case 4: select -d $obj; break; case 5: select -add $obj; break; default: select -r $obj; break; } }
これでMayaの選択操作と共通化できました\(^0^)/