前回の続きでUIを作っていきます。スライダーでCubeの大きさを決めるだけでは全然実用性が無いですので。
では、以下のプログラムからです。
def makeCube(): hei=10 for i inrange(0,hei): pm.polyCube(w=1,h=i+1,d=1) pm.move(0,0,i) pm.rotate(i*10,0,0)
実行して、makeCube()というコマンドをさらに実行します。
こんな芸術的な形状ができます。
解説しますと、
1:関数のmakeCube()を定義。引数は無し
2:heiという変数を10に設定
3:for命令で、iという変数を0からheiまで繰り返し。この下の4~6がインデント(行の頭にスペース)しているのでそれを10回繰り返しします。
4:Cubeを幅1、高さi+1、奥行1で作成
5:Zに1移動します。1,2,3・・・10と変化します。
6:Xにiを10倍した値を回転します。1,10,20・・・100と変化
というわけで、Cubeがだんだん大きくなって、回転しながら移動するという立体を自動生成できます。heiの値を変えれば箱の数も自由に変化できますね。
for命令を忘れた!という方は過去の連載をご覧ください。
そこで、前回のスライダーのプログラムと組み合わせるのです。
import pymel.core as pm Swindow = pm.window('testWindow',t='Slider',w=300,h=100) pm.columnLayout(adj=True) pm.text('input Copy Count') boxH=pm.intSliderGrp(l='Count',min=0,max=20,f=True) pm.button(l='Create',c='makeCube()') pm.showWindow(Swindow)
def makeCube(): hei=pm.intSliderGrp(boxH,q=True,value=True) for i inrange(0,hei): pm.polyCube(w=1,h=i+1,d=1) pm.move(0,0,i) pm.rotate(i*10,0,0)
実行すると、以下のようにスライダーが表示され、その数だけCubeを複製します。だいぶオリジナルツールになってきました。
説明すると、さっき作ったmaleCubeに関数のheiの値をスライダーの値を受け取っているだけです。
前回の連載の内容と比較してください。前回はこれをスケールに値に入れたのですが、それを繰り返す回数にしただけです。
前回との違いはfloatSliderGrpをintSliderGrpに変更しています。
前は「高さ」の値ですから、1.2とか5.6とか小数点以下がありますからfloatですが、今回は「個数」なので整数のintを使います。
プログラムで難しいのは流れているデータが何なのかを予想して作ることです。
このようにアイディアがあれば、プログラムをだんだんと拡張していけば良いのです。
では、さらにその前の連載のラジオボタンを使ってみます。
上の5と6行目の間に以下を行を入れます。
pm.rowLayout(numberOfColumns=3) pm.radioCollection() pm.radioButton(label='BOX') pm.radioButton(label='BALL') pm.radioButton(label='POST') pm.setParent('..')
実行すると、3つのラジオボタンが横並びになります。これも復習ですね。
まだ何も機能が入っていません。そこで以下のように書き換えます。変更点だけ掲載します。どこに入れるかは、画像で確認してください。
radioCo = pm.radioCollection() pm.radioButton('radioButton1',label='BOX') pm.radioButton('radioButton2',label='BALL') pm.radioButton('radioButton3',label='POST')
sele = pm.radioCollection(radioCo, q=True, select=True) for i inrange(0,hei): if sele =='radioButton1': pm.polyCube(w=1,h=i+1,d=1) pm.move(0,0,i) pm.rotate(i*10,0,0) elif sele =='radioButton2': pm.polySphere(r=i+1) pm.move(0,0,2*i) elif sele =='radioButton3': pm.polyCylinder() pm.move(0,0,i*2) pm.scale(1,i+1,1)
実行すると、以下のようにラジオボタンで3タイプのモデルを選んで、スライダーでコピーできるツールになりました。
ボールは直径が2倍づつ大きくなり、柱はY方向に1づつスケールが増えます。
8:radioCoという変数にラジオボタンで選ばれた値を入れる変数を作成します。
9~11:'radioButton?'を各ボタンのラベルの前につけて、どれが選ばれたかの判断に使います。
21:seleという変数にラジオボタンで選ばれた値を入れます。
23、27、30でif、elif命令でseleの値とボタンの値が一致しているか判断して、それ以下の行の命令を実行します。それぞれ、Cube、Sphere、Cylinderのポリゴンで、移動や回転、スケールなどしています。
if命令を忘れた!という方も過去の連載をご覧ください。
少し長くなってきましたが、ゆっくりやればできるはずです。ぜひチャレンジしてください。
次回はチェックボックスと文字入力のフィールドを実験します。