2013年5月27日月曜日

アトリビュートのロック・ハイド

今回もあっさり目のプロシージャネタであります.

キャラクターリグのコントローラにはNURBSカーブやロケータが用いられます.












その際コントローラで制御する以外のアトリビュートにアニメーションが入らないよう
アトリビュートをLock&Hideすることがよくあります.

そんなに面倒な作業ではありませんし、プロシージャ化も容易です.
しかし、さまざまなツールを書いていると「またか」と思うこともしばしば.
隠すチャンネルがそろっていればいいのですが、
隠したいアトリビュートが異なってくると似たような記述でやたらと行が増えてやっかい.
そこで別途のグローバルプロシージャとして使いまわせるよう記述したのがこれです.

引数はtranslateX,Y,Z,RotateX,Y,Z,ScaleX,Y,Z,Visivilityの順に
隠したい場合は0、そうでなければ1を記述し、最後にオブジェクト名.
オブジェクト名以外を一旦整数の配列にした後、
対応するアトリビュート名の文字配列と照らし合わせてfor文で処理するとすっきり.
この文字配列を使った手法は、
分岐が多いけれどあらかじめ分岐内容が判っている場合にとても便利です.

2013年5月20日月曜日

MELで変数の内容を追加させる

またしばらく空いてしまいました.
個人的な事でちょっとバタバタしており、内容も薄味ですが
継続はなんとやらで少しずつでも投稿してゆきます.

スクリプトで変数を扱うとき、たまに必要になるのが
すでにある変数に何かを追加することです.
代入内容をずらっと作成して、一気に入れ込むことが不可能だったり
スクリプトが冗長になってしまうことを避けたいときに用います.

文字変数に追加したい場合は"+="演算子が使えます.
for-in文の場合はこちら
文字にコマンド、フラグ、引数、フラグ、引数・・・、と書き連ね
evalコマンドで実行する内容を作成する場合などに使用できます.

文字配列に追加したい場合、for文であればインデックスを用います.
for-in文の場合は配列の長さ=最終インデックスとなることを利用して
このように追加してゆきます.
複数選択したオブジェクト名を文字列的に処理して、
新しい文字配列を作成する場合などに使用します.

こういったプログラミングでは当たり前の記述については
Mayaのオンラインヘルプはあまり説明されていないので
自分で試行錯誤してゆくか、別のプログラム言語の書籍で知るということになりますが.
一番手っ取り早いのは本職のプログラマーに聞くことなんですよね.
これまで色々と質問に答えてくださったみのまわりのプログラマーさん
どうもありがとうございました.これからもオネガイシマス.

2013年5月7日火曜日

QtDesignerによるUI作成

ゴールデンウィークで一回お休みしました。
今回はQtでのUI作成を取り上げてみたいと思います。
MayaにQtが採用された時には、
これまでツール作成時の労力の半分を占めていたUI作成が
もうなくなるぜヒヤッホーイと思ったものですが、
現在のところ完全に取って代わっている様子は無いようです。
実際にUIを作成し、いろいろ調べたところ
全てのコントロールに対応しているわけではないこと
少々ですが、見た目のスクリプトでの直接記述との違い等が判りました。
検索した結果と自分で試した結果を総合すると、対応できているコントロールは


QtWidget          MELcommand
PushButton        button
RadioButton       radioButton
CheckBox          checkBox
ComboBox          optionMenu
LineEdit          textField
TextEdit          scrollField
ListView          textScrollList
HorizontalSlider  intSlider
VerticalSlider    intSlider
Label             text
ProgressBar       progressBar
HorizontalLine    separator
VerticalLine      separator
TabWidget         tabLayout
MainWindow        window

以上に限られているようです。
今後対応が増えるとのアナウンスもありましたが
Mayaバージョンアップ時に触れられていないのでしばらくはこのまま?

まず試しに既存のツールを置き換えてみようかということで
いつものウェイト読み書きツールであります。
現在のUIがこう。
QtDesignerを起動します、場所はMayaがインストールされているbinフォルダです。
新規フォームでmainWindowを選択

ウィジェットボックスからTabWidgetをドラッグ&ドロップ
何も選択されていない状態でツールバーの格子状に並べるをクリック。
するとタブレイアウトとウィンドウがグループ付けされてタブがウィンドウにフィットします。
ウィジェットボックスからボタン、テキスト、テキストフィールド等をドロップし、
それらをすべて選択して、ツールバーの垂直に並べるをクリック。
するとmelのcolumnLayoutのように縦に整列され、グループ化されるので
大きさや位置を調整します。
次に、レイアウトやコントロールの名称やラベルを設定します。
プロパティエディタのオブジェクトネームやテキストで
コントロールの名称やラベルを設定します。
全てのウィジェットの名称を設定する必要はありませんが
コマンド実行時に参照されるコントロールのオブジェクトネームは必須です。
リネームが完了したら次はボタンにコマンドを付け加えます。

ボタンを選択し、プロパティエディタの緑十字ボタンをクリック
プルダウンメニューから文字列を選択し
ダイアログに"+command"と入力します。
今回はpythonなので、コマンドフラグの前に"+"をつけます。
melの場合は"-"を付け足します。
コマンド内容をシングル、ダブルクォートでくくって文字列とするのを忘れずに。
これでQtでの作業は完了、適切な場所と名称(今回はqtWeightTrade.ui)で保存します。

呼び出すpythonファイルの編集をします。

レイアウトやコントロールの定義部分を全削除。
loadUIコマンドで.uiファイルを呼び出し、showWindowコマンドで表示するだけになります。
下線部は各自が.uiファイルを保存したパスに書き換えてください。
テスト実行時にmelコマンドのインポートエラーが出てしまい。
ファイル先頭部分と実行の記述を書き換えました。
ここら辺はまだまだpythonの勉強不足です。

実行させたものがこちら
melで直接記述したものと微妙に異なってしまいます。
プロパティを細かく詰めてゆけばあるいは同一になるやもしれませんが
どうやらQtはUIを作るツールというものではなく、
UI作成に強いプログラム開発ツールのようです。
細かくUIを設定したい時より、とりあえずUIが欲しいけれど
コントローラが多くて手書きは面倒な時などに役立つのかもしれません。

ysWeightTrade2.py

qtWeightTrade.ui