maya
Maya UIの作成
サーチ…
パラメーター
| パラメータ | 詳細 |
|---|---|
| e / edit | 既存のプロパティの値を変更することをMayaに指示します |
| q /クエリ | 既存のプロパティの値を取得することをMayaに指示します |
備考
Mayaには、ウィンドウ、レイアウト、およびさまざまなコントロールを含むかなり完全なUIツールキットが付属しています。これはC ++のQTフレームワークを使用して実装されますが、デフォルトのMayaコマンドセットを使用してMELおよびPythonユーザーに公開されています。
QT
上級ユーザーは、C ++またはPythonを使用してMaya UIを拡張できます。 2012年から2016年のMayaバージョンはPysideとQT4を使用しています。 Maya 2017はPyside2とQT5を使用します。詳細はこちら
注意: Web上の古いリファレンスは、Maya GUIツールキットを「ELF」と呼んでいます。それはまだ正しい名前ですが、めったに使用されません。
基本的なUIの例[Python]
Maya GUIツールキットは、シンプルで必須のさまざまなUI要素を作成します。 GUIウィジェットを作成および編集するための基本的なコマンドがあります。ウィジェットは一意の文字列名で識別されます。
すべてのguiコマンドは同じ基本的な形式を取っています:コマンドタイプと、作業するオブジェクトの文字列名と、ウィジェットの外観や動作を指定するフラグを指定します。たとえば、ボタンを作成するには、次のようにします。
cmds.button('my_button', label = 'my label')
これにより、新しいGUIボタンが作成されます。あなたと同じコマンドを使用したいボタンを編集するにはeditフラグを(ショートバージョンだけですe )。だから、あなたはこのようにボタンのラベルを変更することができます:
cmds.button('my_button', e=True, label = 'a different label')
queryまたはqフラグをqueryてプロパティの現在の値をクエリできます。
cmds.button(`my button`, q=True, label=True)
# 'a different label'
ウィジェットの命名
UIコマンドを使用して新しいウィジェットを作成するときには、新しいウィジェットに取得する名前を指定できます。ただし、保証されていない :Mayaは、あなたが要求した名前をボタンに与えます。それが認識できない文字を与えた場合、または同じ名前のウィジェットが既に存在する場合は、別の名前に戻すことができます。驚きを避けるために作成した新しいウィジェットの名前をキャプチャするのは、 常に良い方法です。
my_button = cmds.button('my_button')
cmds.button(my_button, e=True, label = "a new label")
コールバック関数
多くのウィジェットには、ユーザーがウィジェットとやりとりしたときにコールバック関数を起動できるイベントが含まれています。たとえば、ボタンが押された場合、チェックボックスがオンになっている場合、またはドロップダウンが選択されている場合は、機能を起動できます。
これらのイベントに関連する正確なフラグはウィジェットによって異なりますが、典型的なコールバックは次のようになります。
def callback_fn(_ignore):
print "button pressed"
button = cmds.button(label='press me', command = callback_fn)
ボタンを押すと、リスナーウィンドウに「ボタンが押されました」と表示されます。ほとんどのウィジェットは、コールバックがアクティブになったときにいくつかの引数を発生させます。たとえば、 buttonは常にブール値が含まれているため、コールバックハンドラには使用しているウィジェットに適切なシグネチャがあることを確認する必要があります。そのため、 callback_fn()は引数を必要としなくても引数をとりcallback_fn() 。
コールバックの割り当て
Mayaは、コールバック関数をアタッチする2つの異なる方法をサポートしています。
# this works, but is not a great idea
cmds.button(label = 'string reference', command = 'string_name_of_function')
# use this form whenever possible
cmds.button(label = 'direct function reference', command = callback_fn)
最初の例では、コールバックは文字列値によって割り当てられます。 MayaはグローバルなPythonスコープでコールバックを見つけることができます。これは通常、適切に整理されたコードを書くときにアクセスするのが難しいです。文字列名のコールバックも解決が遅くなります。 2番目の例では、実際のPython関数をコールバックに渡しています。この形式はより速く、コールバック関数に有効な関数を提供できなかった場合は、いつUIを作成するのかUIウィジェットが実際に使用されます。
引数の値をコールバック関数に渡したい場合は、 lambda 、 closure、またはfunctools.partialバインド引数をコールバックに使用できます。
partial使用:
from functools import partial
....
def callback_fn(myValue, _ignore): # _ignore swallows the original button argument
print myValue
button = cmds.button(label='press me', command = partial(callback_fn, "fooo"))
lambdaを使う:
def callback_fn(myValue):
print myValue
button = cmds.button(label='press me', command = lambda _ignore: callback_fn("fooo"))
# here the lambda needs to handle the button argument
クロージャを使用する
b = cmds.button(label = 'press me')
# by defining this function when `b` exists, we can use it later
# without storing it explicitly
def get_button_label(*_):
print "label of button", b, " is ", cmds.button(b, q=True, l=True)
cmds.button(b, e=True, c=get_button_label)
そこコールバック関数対文字列コールバックの名前について」もっとここに
ウィンドウの作成
# create a window with a button that closes the window when clicked
window = cmds.window(title='example window') # create the window
layout = cmds.columnLayout(adjustableColumn=True) # add a vertical layout
def close_window(*_):
cmds.deleteUI(window) # deletes the window above
button = cmds.button(label= 'press to close", command = close_window)
# show the window
cmds.showWindow(window)
ラムダとループ
Lambdaは、GUI要素に動作を引きつけるための便利なショートカットです。
b = cmds.button("make a cube", command = lambda _: cmds.polyCube())
しかし、Pythonがlambdaの内部で変数を取り込む方法のために、ループ内でlambdasを使用してコマンドをバインドすると、予期しない結果が生じることがあります。たとえば、これは異なるサイズの球を作成するボタンを生成するように見えます:
# warning: doesn't work like it looks!
for n in range(5):
b = cmds.button("sphere size %i" % n, command = lambda _: cmds.polySphere(radius=n))
ボタンは正しくラベル付けされますが、ループが終了するとラムダがすべてその値を取得するため、すべて同じ半径(4)を使用します。 TLDR:ループ内でコールバックを生成している場合は、 functools.partialなどの値を取り込むメソッドを使用してfunctools.partial 。このアプリケーションではラムダは機能しません。詳細はこちら