スライダーを使った GUI
スライダー
スライダーには以下の種類があります。
int と float のスライダーの違いは整数値をとるか、実数値をとるかの違いだけです。
intSlider と floatSlider、floatSliderGrp と attrFieldSliderGrp は見かけ上はほとんど違いがありません。
- intSlider
- 整数のスライダーです。
- intSliderGrp
- ラベル、整数値のフィールド、整数値のスライダーを組み合わせたものです。
- floatSlider
- 実数のスライダーです。
- floatSliderGrp
- ラベル、実数値のフィールド、実数値のスライダーを組み合わせたものです。
- attrFieldSliderGrp
- ラベル、実数値のフィールド、実数値のスライダーを組み合わせたものでノードのアトリビュートに接続してリアルタイムに値を変更できます。
スライダーの使い方
スライダーはボタンのようにコントロール(ウインドウの部品)の一種ですが、
ボタンと違って少し使い方が複雑です。
スラーダーを使用する時は以下の手順で実行します。
- スライダーの作成
ボタンと同じようにレイアウトコマンドの後でスライダーコマンドを実行してスライダーを作ります。
作成方法は以下のどちらかです。
- スライダーに名前をつける方法
- pm.floatSliderGrp('スライダー名', label='ラベル', field=True,
min=最小値, max=最大値, step=増分, value=初期値)
- 作成したスライダーオブジェクトを変数に入れる方法
- 変数 = pm.floatSliderGrp(label='ラベル', field=True,
min=最小値, max=最大値, step=増分, value=初期値)
- スライダーの値を得る
現在のスライダーの値を得るためには、もう一度スライダーコマンドを実行します。
- スライダに名前をつけていた場合
- pm.floatSliderGrp('スライダー名', q=True, value=True)
- スライダーオブジェクトを変数に入れていた場合
- 変数.getValue()
スライダーコマンドは上のように 2 度以上実行されるのが普通です。
スライダーの使用例
ここでは floatSliderGrp を使ってみましょう。
以下のスクリプトはスライダーで指定された半径の球を作るものです。
作成 ボタンを押すと指定された半径の球がひとつ作られます。
- 以下の Python スクリプトを slider1.py という名前で作ります。
import pymel.core as pm
def makeSphere(rs):
val = rs.getValue()
pm.sphere()
pm.scale([val, val, val])
with pm.window(title='slider1'):
with pm.autoLayout():
pm.text(label=u'球を作成')
rs = pm.floatSliderGrp(label=u'半径', field=True, min=0.1, max=20.0, step=0.1, value=1.0)
pm.button(label=u'作成', command=pm.Callback(makeSphere, rs))
- スクリプト エディタ の によって slider1.py を読み込んで、テンキーの Enter キーなどで実行します。
- 以下のようなウインドウが表示されます。
- スライダーの値を 2.0 にして 作成 ボタンを押すと XYZ 方向に 2 倍スケールされた NURBS の球が作られます。
スクリプトの解説
import pymel.core as pm
- pymel.core モジュールをインポートしてpmという名前で使用できるようにします。
-
def makeSphere(rs):
- makeSphere という名前の関数の宣言です。
引数rsにはスライダが入っています。
-
val = rs.getValue()
- 変数rs に入っているスライダーから現在の値を得て変数 val に代入します。
getValue() というメソッドによってスライダーの値を得ることができます。
-
pm.sphere()
- NURBS の球体を作ります。
-
pm.scale([val, val, val])
- val の値で XYZ 方向にスケールをかけます。
-
with pm.window(title='slider1'):
- slider1 というタイトルのついたウインドウを作ります。
-
with pm.autoLayout():
- GUI 部品を縦に並べるレイアウトコマンドです。
-
pm.text(label=u'球を作成')
- text() 関数によってウインドウ内にテキストを表示します。
label を忘れないようにしてください。
文字列の前の u は Unicode を表します。
文字列に日本語を使用するときには、文字列の前に u をつけます。
-
rs = pm.floatSliderGrp(label=u'半径', field=True, min=0.1, max=20.0, step=0.1, value=1.0)
- floatSliderGrp を作り変数rsに代入します。
floatSliderGrp の各フラグの意味は以下の通りです。
- label=u'半径'
- 左側に表示されるラベルです。
- field=True
- フィールドを表示するかどうかを決めます。
True だとフィールドを表示します。
False だとフィールドの部分が表示されません。
- min=0.1
- スライダーの最小値。
スライダーを一番左にスライドさせた時の値です。
- max=20.0
- スライダーの最大値です。
スライダーを一番右にスライドさせた時の値です。
- step=0.1
- スライダーの増分値です。
スライダーの地の部分でマウスを1回クリックした時に増減する値のことです。
- value=1.0
- スライダー・フィールドの初期値です。
スライダーが表示された時の最初の値です。
-
pm.button(label=u'作成', command=pm.Callback(makeSphere, rs))
- 押すと makeSphere() が実行される、作成 というラベルのついたボタンを作ります。
引数には実行する関数名、関数に渡す変数を並べます。
ここでは、関数名makeSphereとスライダの入った変数rsです。
-
pm.showWindow()
- ウインドウを表示します。
Tips (attrFieldSliderGrp の例)
球体の X 方向のスケールを変更するスクリプトです。
import pymel.core as pm
name = pm.sphere()
with pm.window(title='attrFieldSliderGrp'):
with pm.autoLayout():
pm.text(label='Change Sphere Scale')
pm.attrFieldSliderGrp(label='scale X', min=0.1, max=20.0, at=name[0].sx)
- attrFieldSliderGrp についての解説。
- label='scale X'
- 左側に表示されるラベル
省略するとアトリビュートの名前になります。
- min=0.1
- スライダーの最小値
- max=20.0
- スライダーの最大値
- at=name[0].sx
- どのアトリビュートをコントロールするかを決めます。
ここでは球体 name[0] の sx アトリビュートを attrFieldSliderGrp によってコントロールします。
attrFieldSliderGrp には value フラグはありません。
練習
- 上の slider1.py を参考にして slider2.py を作り、X 方向のスケール値だけを変更できるようにしてみましょう。
slider2.py を読み込んで実行した直後のウインドウ
スライダーの値を 2.0 にして 作成 ボタンを押した結果
- slider2.py を参考にして slider3.py を作り、X、Y、Z 方向のスケール値を別々に変更できるようにしてみましょう。
slider3.py を読み込んで実行した直後のウインドウ
スライダーにおける Scale X の値を 2.0、Scale Y の値を 3.0、Scale Z の値を 4.0 にして 作成 ボタンを押した結果
まとめ
- スライダーは作成時および値を得る場合にコマンドを実行する必要があります。
- attrFieldSliderGrp によってオブジェクトのアトリビュートを直接コントロールできます。
- スライダーから値を得るには getValue() メソッドを使用します。
参考
- Maya
Maya, MEL 関係(Tips, FAQ, コマンド)のページ
Prev | Next
Home | Contents
Mail