|
パネルについての注意 >> この問題は Version 3で解消されました。 Maya のパネルについては、全ページを参照してください。 Maya;Python でカスタム・グラフエディタを作ろう!! |
HyperGraph について ; Python カスタム・グラフエディタからの引き続きなのでお分かりの通り、Mayaの HyperGraphも、scripted panelである、ということです。 ■scriptedPanelhttp://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/scriptedPanel.html 従って、何枚かHyperGraphをティアオフコピーした後に、 何枚HyperGraphのスクリプト・パネルが存在しているかを調べるには
となります。 GraphEditorの時と同じで、次に作るハイパーグラフの番号を計算して、その番号で HyperGraph を作成している部分が以下の通りです。 複数のカスタム・ハイパーグラフを表示しても動作するように、ユニークな名前をこの番号で作ります。
例の如く、GUI系のコマンドはMELしかないものが多く、mel.evalを使っているところがあります。 Pythonから$hyper_panel_nameに値を引き渡し、tearOffPanelコマンドに使っています。 その下の部分は、作成されるHyperGraphの設定を、やはりmel.evalを使って行っています。
例えば、HyperGraph 表示内の オプション > 向き > スケマティックに設定していたり、 オプション > レイアウト > フリーフォームレイアウトに設定していたり、 オプション > ディスプレイ > [レ] コンストレイント接続にチェックを入れたり、 オプション > ディスプレイ > [レ] エクスプレッション接続にチェックを入れたり、 オプション > [レ]ノード表示のオーバーライドカラーにチェックを入れたりしています。 特に、最後のオーバーライド表示を有効にしないと、色表示してくれません。 好みに応じて設定を変更してみてください。 |
UnfoldHierarchy = 階層構造の展開;Python HyperGraph画面内にも、編集 > すべて展開という機能はあるのですが、 それは選択したもの以下の階層構造を"展開"してくれるツールです。(以下画像参照↓) キャラクター製作など階層構造が広い場合、選択しているものの構造が展開する構造の一番上とは限りません。 例えば、小指の先のノードを選択してその構造を見たい時、 そのはるか上の構造から"折り畳み"されていたらどうでしょう。(以下画像参照↓) [UnfoldHierarchy] ボタンで用意した機能は、この一番下の構造体が選択されている場合でも"展開"するツールです。 さて、スクリプトの解説です。 それを実現するには、すごく特徴的なMelコマンドを利用します。 ■rootOfhttp://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/Commands/rootOf.htm 一番下のものが選択されていたとして、その親にたどり着くまでループ処理をするのではなく(処理負担だったかかるし)、 rootOf( $o_selected );とするだけでOKです。 一番上を見つけたら、展開とするので、階層構造全部を展開します。 ただし、ここで億劫なのは、展開を実行するパイパーグラフの名前(パネル名)を取得しなければならないところでしょうかね。
追加情報として、何も選択していない状態で、シーンのルートを全部選択出来る方法(コマンド)があります。 ■selectMode http://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/selectMode.html このコマンドで、選択モードというものがあり、rootとするとMayaシーン上の一番上のものを全て選択可能な状態にしてくれます。 そこで・・・
と実行すると、一番上のもの全部を選択するので、そこから編集 > 全てを展開を実行すれば、シーン全部の階層構造を展開します。 |
SetSameSRT = 位置/回転/スケールの一致;Python さて、お次は位置/回転/スケールを一致させてくれるツールを作りました。 これは、Softimageにある、(位置/回転/スケールの一致)させるツールに似せた動きになればいいなという発想です。 スクリプトとしては何てことない、目標物のグローバル値を取得して、動かしたいものにそのグローバル値を設定すれば良いのです。 Mayaには修正 > オブジェクトのスナップ位置合わせ > ブジェクトの位置合わせがあるのですが、 何故か Joint に効かない・・みたいでした。 [SetSameSRT]は、Locator、Joint、Group,CameraなんでもTranslate値 が取得/設定出来る限り動きます。 [上図解説;位置を合わせたいものは黄色のLocatorや水色のJointで、 目標地点は、同じルート上の紫色のLocatorや階層途中の肌色のJointだったりします。 オブジェクトの位置合わせではこの場合Locator同士しかうまく動作しないみたいでした(Maya2015SP5。 [SetSameSRT]ではどれでも、しかも回転/スケールにも対応します。 (注意;JointのScale値は設定されていても単独だと見た目が変わりません~)] さて、スクリプトの解説です。 それを実現するには、おなじみのxformを利用します。 ■ xformhttp://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/xform.html xformのオプションにはworldSpaceというフラグがあり、グローバル値で移動/回転/スケール値を扱います。 取得も設定もこれ1つで出来、しかも3軸いっぺんに設定出来るので大変便利です。 移動値設定の時は、2つのノードを選択した状態で、
となります。 回転値はrotation=True、スケール値はscale=Trueです。 移動/回転/スケール値を設定するコマンドは、実は他にもあります。 ■movehttp://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/move.html ■rotatehttp://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/rotate.html ■scalehttp://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/scale.html move を使って移動値を設定する場合はこのようになります。
X,Y,Z軸用に個別に取得してから、moveで値を設定します、この時のオプションもworldSpaceを使います。 これでも良かったのですが、scaleでworldSpace の設定が無い?みたい で正確な値が設定出来ない場合があるので、xform 一択になりました。 あとは、GUIのメニューの方ですが、プルダウン式の選択になっています。 これの作成はoptionMenuというコマンドを使います。 ■optionMenuhttp://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/optionMenu.html 最初の2行は、作成されるHyperGraphのパネル名を取得しているだけです。 そのパネル名をoptionMenu名に追加することで、ユニークな名前にしています。 menuItemにプルダウンのメニューに追加したい名前を列挙します。
それを受けて、グローバル値を取得/設定する方法は、以下の通りです。
try文は以前に説明した通り、ノードを2つちゃんと選択しなかった場合のエラーを except文で用意したPrint文を出力にして、エラーを回避しています。 |
ConstraintOp = 全種のコンストレイント;Python さて、お次はMayaのメインメニューのコンストレイント項目の機能(オプション画面)を起動しているだけです。 階層構造が見えているハイパーグラフ画面でコンストレイントを設定出来た方が解り易いと思ったからです。 プルダウン式の選択は上記optionMenuを使い、実行側はif文で分岐を沢山作っただけです。
MayaはGUIにからむコマンドはMelになりますので、mel.evalを使って実行しています。 |
カラーのスクロールバーと色設定;Python 次に用意したのが、ワイヤーカラーの設定ツールです。 カラーの表示とスライダーが設定出来るコマンドが用意されていて、便利に使えそうです・・一見・・・ね。(どハマリする事うけあいです!) ■colorIndexSliderGrphttp://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/colorIndexSliderGrp.html Mayaの標準機能と比較して見てみましょう。 選択しているものが Locator だった場合、ワイヤーカラーはトランスフォームアトリビュート > ディスプレイ > 描画オーバーライド項目で、 [レ]オーバーライド有効化をオンにして、下のカラーの色付きスライダーで設定します。 このスライダーは、調べると 32色のインデックスカラーだと解ります。 32階調ってことは1から始まって32で終わるcolorIndexSliderGrpを作ればOKです、なーんだ簡単と。
作成された window の色スライダーを動かすと色が変わり右端まで行くと赤紫色まで行って、 Mayaの標準の描画オーバーライドにある色スライダーと同じ色になります。やった~っと。 では、この値を、選択した例えばLocatorにオーバーライドをオンに設定して、色を設定してみます。 スライダーの値の取得方法も一般的なq=True を使うとします。
Locatorを選択して実行します。するとおお、良さげ・・・、人間のサガらしく、スライダーだと左右に動かしたくなりますね。 右端まで行って左に戻した瞬間、なにやらエラーが出ます。 # エラー: RuntimeError: file <maya console> line 5: setAttr: アトリビュート 'locator4.overrideColor' は最大値 31 より大きく設定できません。 # そしてそれ以降は、表示している色と Locator の色は 違っていきます。 これ、数値をPrintすると解るのですが、どうやら colorIndexSliderGrp のスライダーは 右端に行って左に動かした瞬間、次の数値が折り返した最後の値に1を追加するみたいなんです。 つまり右端だった場合Max値を超えてエラーが出るようです。 かと言って、31までのスライダー範囲にしたら、それは window 上に表示している色がずれてしまいます。 q=True を使って値を取り出す方法も数値が合わないような気もします。~つみます。 そこで、考えたのは、colorIndexSliderGrp の色表示部分は使いますが、スライダーは捨てます。 スライダー部分は intSlider を使って 32階調 の数値を作り、lambda関数を使って正確な値を Locator に伝えます。
colorIndexSliderGrp のオプションでcolumnWidth3=[77,70,0]としているので3番目のスライダー部分は表示されません。 colorIndexSliderGrp では 0 ~ 32 の範囲に設定し、intSlider では0 ~ 31 に設定しています。 色を設定している側はこの通りです。
設定する値はintSlider から来る値に1足し算してcolorIndexSliderGrp に改めて色設定をしています。(色をそろえている) 次の if 文は、選択しているものがあればそれに色を設定します。 何にも選択してない場合は、表示色だけが変わる、という仕組みです。 選択しているもの全てに色を設定するのが[SetColorToSelected]というボタンです。 階層構造の途中のものだけ色を変えたいという事案もあり、 選択した階層構造以下を全部ではなく、選択しているものだけ色が変わる、に変更しました。
今度は、あえてcolorIndexSliderGrp の値から色を設定しているのですが、q=True を使って取り出した値から1引いてます。 そうすると表示している色と合います。変?ですかね。いや~。 色設定ツールを作ろうとして colorIndexSliderGrp の不思議にはまった人の参考になればと思います。 ツールを使っている方は、まさか、裏でこんな苦労があるなんて、・・・知りませんよね。普通 ^_^ ;; 余談ですが、カラーのスライダーで最初の色はグレー表示になってますが、あれ、グレー色なんじゃなくデフォルトの色なんですよね。 番号で言うと1番です。で、0番は少し明るいグレー表示になるのですが、設定される色は黒ですかね。余談でした~。 |
Version 2;表示設定;Python optionVar 使ってくれるユーザーの好みが幅広く、また用途によっても異なるものが、階層構造の表示方法と表示するものの設定でした。 そこで、間単に設定出来て、次回Mayaが起動する時にもその設定で表示するようにしました。 用意したのは、表示方法を選択出来る画面と設定を保存する仕組み、は、optionVarです。 ■optionVarhttp://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/optionVar.html 設定したい項目は6項目とし、6個の文字、例えば上から '112211' という文字で各設定がなされ、 それを optionVar で保存しておく、としました。名前は'chg_setup_var'としました。
最初の起動時は、この値('chg_setup_var')のoptionVarは無いので、無ければ初期値を設定する、って書きます。
次からは、この値('chg_setup_var')のoptionVar はあるので、値を引き出すには q を使います。
例えば、最初の項目の Hierarchy ◎ Skematic ○ Horizontal ○ Vertical という部分は
って書けば、6文字の先頭が1 ならスケマティック、2なら水平、3 なら垂直となります。 Pythonは文字遊びが得意です。インデクシングとスライシングはとっても便利、以下例を把握しましょう。 ■スライス表記: コロンで区切られた二つのインデクスで指定http://docs.python.jp/2/tutorial/introduction.html#tut-strings
ポップアップする設定GUIの方は、もちろんラジオボタンですが、 ■radioButtonGrphttp://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/radioButtonGrp.html
それを受け取るコマンド側は、もちろん optionVarに値を設定するようにします。
尚、このoptionVar の値が Maya起動時に有効になるには、デフォルト設定ではあるのですが、 ウィンドウ > 設定/プリファレンス > プリファレンス内の設定 > 保存時のアクション > プリファレンスと設定項目の [レ]Maya終了時すべてのプレファレンスと設定を保存が有効である必要があります。 |
Version 3;Panel対処とWindow化 カスタム・グラフエディタのV20でも記述しています通り、こちらも作成されるパネルをWindow内にちゃんと管理して配置し、 併せて使われなくなったパネルを削除して、パネルが増殖し続けるのを防ぐ対応をしました。 枠に表示されるラベル名も、New CustomHyperGraph* となりました。(また、Maya2016で作業を開始しました) さて、ものすごく進歩したにも関わらず、機能的に新しく解説できるものは、何もありません。 使う方としては、勝手にドンドンパネルが蓄積していくようなことは無くなり安心して使えるようになった、ということになります。 Python 解説 では、こちらの Pythonについての解説はというと、カスタム・グラフエディタの記述とほぼ同じになります。 まずは、数枚ハイパーグラフ を作成(ティアオフのコピー)した場合、そのリストを取得するには、こう書きます。
最初のhyperGraphPanel1はデフォルトのパネル名なので、このリストから外しておきます。
表示してないパネルのリストから、ハイパーグラフがあったらそのパネルを消します。
さて、もう1つの進歩として、ハイパーグラフというスクリプトパネルをちゃんとWindowコマンドの中に入れて表示する、というところです。 こちらもカスタム・グラフエディタの記述とほぼ同じになります。
あとは、window の名前の重複とか、 パネルの番号を各ボタンにも使って複数のグラフエディタが表示された時にボタン名がユニークになるようにしたりとか・・ と、かなりの変更がありました。興味がある方は スクリプトの中身を見てみてください。 以上です。 |
Version 4;接続表示のオプション機能に対応(動作確認Maya2014以上) Maya 2015 から、Hypergraphの接続表示にオプションが追加されたので、その機能のON/OFFを設定画面から 行えるように工夫しました。 オプション > ディスプレイ > フィルター接続 > ●すべての接続を表示(デフォルト) ○選択項目への/選択項目からの接続を表示 ○選択項目への接続を表示 ○選択項目からの接続を表示 ただし、メニュー表示は変わったのですが、Maya2014にある機能とは変わりがないので、Maya2014でも動作します。 左下の[ Setup ] ボタンから表示設定画面が表示され、●NoFilter○to/From ○To○Fromが設定出来ます。 ●to/Fromは選択項目への/選択項目からの接続を表示になり、 たくさんのコンストレイントが設定されている場合に水色の接続線が選択されたものだけになり、表示が見やすくなります。 また、今回、横に並ぶボタン数を減らし、縦表示にしてハイパーグラフを使う時に横幅がおさえられるようにしました。 Python 解説 というか機能解説になります。 まず、Maya2015からオプション > ディスプレイ > フィルター接続 > ●すべての接続を表示(デフォルト) というメニューになって、Maya2014とどう変わったのかを Mel から見てみました。 ★ Maya2015の場合 > updateFilterConnFromMenu // 結果: Mel procedure found in: C:/Program Files/Autodesk/Maya2015/scripts/others/HyperGraphEdMenu.mel // するとsetFilterSettings( $editor, $name, ($toFrom || $from), ($toFrom || $to));がみてとれますが、 これって、Maya2014で行っている hyperGraph -edit -showConnectionFromSelected off hyperGraphPanel2HyperGraphEd hyperGraph -edit -showConnectionToSelected off hyperGraphPanel2HyperGraphEd の事だって解ったのです。 確かにMelの記載はかわっているのですが、動作としては変わらないのです。 (ちなみにMaya2012ではないオプションコマンドなのでエラーになりました。) これをPythonで書くと、以下のようになります。
ところが、既存の mel.eval から名前を引っ張って来て代入するPython記述に追加するかたちにしたかったので、
として4つの場合をmel.evalで列挙して実行させました。 また、optionVarとして記憶されておく桁が1つ増えました。 そこで、従来から使っている人は6桁で、まったく新しく使う人は無い訳で、こんな分岐を書いてみました。
万が一、optionVarが壊れてしまっていたら、消すしかないのですが・・・。いや、無いと思いたいです。
横のボタン数が変わったのは、途中で setParent('..')を挟んで、残りの数をrowLayoutに書いただけです。
以上です。 |
CustomHyperGraph.py と既知の制限・注釈 という訳で現在のところまでのカスタム・ハイパーグラフ のファイルを公開します。 (Pyファイルは シェルフにボタン登録するか、プルダウンメニューに登録して実行します。) あくまでも自己責任でお使いください。Use as your own risk.
|
という訳で、次回はまたMayaでしょうかね。 乞う、ご期待!! Stay tuned ..
|