文系デザイナーのためのmaya MEL/Python基礎の基礎 Step2-11

前回の続きで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の値をスライダーの値を受け取っているだけです。前回の連載の内容と比較してください。前回はこれをスケールに値に入れたのですが、それを繰り返す回数にしただけです。

前回との違いはfloatSliderGrpintSliderGrpに変更しています。
前は「高さ」の値ですから、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命令を忘れた!という方も過去の連載をご覧ください。
少し長くなってきましたが、ゆっくりやればできるはずです。ぜひチャレンジしてください。
次回はチェックボックスと文字入力のフィールドを実験します。

文系デザイナーのためのmaya MEL/Python基礎の基礎 Step2-10

前回でPythonを使って様々なUIの機能があることが解りました。
今回は、ちゃんと使えるツールとして発展させます。
まず、以下をスクリプトエディタで実行してみてください。
import pymel.core as pm
window = pm.window(“testWindow”,t=”Slider”,w=300,h=100)
pm.columnLayout(adj=True)
pm.showWindow(window)

解説すると、
2:ウインドウの設定でタイトルや大きさを決定
3:縦に並べる設定
4:ウインドウを表示
実行すると、以下のようにウインドウが出ます。

さて、これに4行加えてみます。
pm.text(“input Cube W,H,D”)
pm.button(l=”Create”,c=”makeCube()”)

def makeCube():

cube = pm.polyCube()

 解りやすいように改行を入れてますが、あっても無くても同じです。
5:テキストで文字を出す
6:ボタンを作って、lがボタンの表示でcがボタンクリックしたら実行される命令です。過去にはlabel=command=と書いてましたが、省略できます。
マニュアルを見ると()で書いてありますね。
10:関数を定義します。
11:ポリゴンのキューブを作成します。
実行すると、このようにウインドウが出ます。

ボタンをクリックすると、Cubeが生成されます。

ボタンをクリックすると、関数を実行するという仕組みです。
ここまでは復習ですが、基本なのでしっかりやります。では、ここから改造していきます。
 改造したのは、6、10、11行目です。
pm.button(l=”Create”,c=”makeCube(2,5,3)”)
def makeCube(wid,hei,dep):
cube = pm.polyCube(w=wid,h=hei,d=dep)
6:実行コマンドに「引数」を3つ(2,5,3)を付けています。
これも復習ですが、引数は関数へデータを送る役割です。
11:引数を受け取る、3つの変数(wid,hei,dep)を設定しています。
12:引数3つをw,h,dに代入してCubeを作成してます。
 マニュアルを見ると、w=幅、h=高さ、d=奥行を意味します。
実行すると、Cubeが引数の通りの大きさで作成されます。
さらに改造します。6,10行を変更し、12行を追加してます。
pm.button(l=”Create”,c=”makeCube(2,5,3,2.5)”)
def makeCube(wid,hei,dep,mov):
pm.move(0,mov,0,cube)

6:引数が4になっています。makeCube(2,5,3,2.5)。高さ5の半分の2.5です。
10:関数で受け取る側も4つにして、新しくMovという変数です。
12:moveは移動する命令で、Yにmovだけ移動します。cubeは11行目で決めた名前です。アウトライナで出るオブジェクト名ではないので注意です。

ちゃんと高さが2.5でCubeは原点から上にできました。
では、ここからスライダを付けて、自由な高さにできるUIにしていきます。
import pymel.core as pm
Swindow = pm.window(“testWindow”,t=”Slider”,w=300,h=100)
pm.columnLayout(adj=True)
pm.text(“input Cube W,H,D”)
boxH=pm.floatSliderGrp(l=”High”,min=0,max=20,f=True)
pm.button(l=”Create”,c=”makeCube()”)
pm.showWindow(Swindow)
def makeCube():
 wid=1
 hei=pm.floatSliderGrp(boxH,q=True,value=True)
 dep=1
 pm.polyCube(w=wid,h=hei,d=dep)
 pm.move(0,hei/2,0)
だいぶ変わったように見えるかもしれませんが、6、12~14行が追加で、他は少し変更しただけです。
6:スライダーを作成して、値をboxHという変数に入れてます。
ラベルと最大値、最小値を決めてます。「f=True」は数値入力をOKとする設定です。
7:関数の引数を無くしました。勿体ない!かもしれませんが、次回以降で使います。
12~13:Cubeの3つの大きさの変数の値を入れています。高さだけスライダーで設定したboxHを代入しています。qとvalue(v)はとりあえず付けておく、ということでOKです。
15:Cubeを作成しています。cube=と変数に代入をやめました。何が違うのか?も次回以降にします。
16:Cubeを移動します。高さをスライダーの値を1/2しているので、必ず高さは原点になります。
では、実行してみましょう。

ちゃんとスライダで高さを決めて、Createボタンで作成できました。
さらに幅と奥行きにスライダーを追加すれば完成です。

変更箇所は7をコピーして、6、8に、15行を14、16にコピーして変数を書き換えているだけです。
これで実行します。

スライダーが3つになり、それぞれを変化させてCubeが作成できるUIをプログラムできました。
 いかがですか?次回はラジオボタン、チェックボックスを使ってみます。

文系デザイナーのためのmaya MEL/Python基礎の基礎 Step2-9

今週から毎週、火曜・金曜のブログ更新をすることになりました。ぜひ訪れてみてください。

今回もGUIをMayaに追加してみます。前回のriRig,CustomOutlinerは今回の伏線です。使われているUIの要素をよく見てみましょう。
*ボタン
*ラジオボタン
*チェックボックス
*スライダ
の4つであることが解ります。ボタンは既にやったので他の3つを考えてみます。
例によって公式マニュアルを見てみましょう。
 ラジオボタン チェックボックス

スライダは「intSlider」と「floatSlider」があります。

それぞれのMELサンプルをPyMel変換ツールでPythonにしていきます。

まず、ラジオボタンです。
import pymel.core as pm
pm.window(width=150)
pm.columnLayout(adjustableColumn=True)
pm.radioCollection()
pm.radioButton(label=”One”)
pm.radioButton(label=”Two”)
pm.radioButton(label=”Three”)
pm.radioButton(label=”Four”)
pm.showWindow()

実行すると、以下のようなウインドウが出てきて、クリックでラジオボタンで1つだけ選べます。これでは何も起きません。

命令は、columnLayoutで縦に並べる、radioCollection()でボタンのグループを作って1つだけ選ぶようにし、radioButton(label=”One”)でラジオボタンを出す、のようです。

次に、チェックボックスです。
import pymel.core as pm
window=str(pm.window(width=150))
pm.columnLayout(adjustableColumn=True)
pm.checkBox(label=”One”)
pm.checkBox(label=”Two”)
pm.checkBox(label=”Three”)
pm.checkBox(label=”Four”)
pm.showWindow(window)

実行すると、以下のようなウインドウが出てきて、クリックで複数チェックできます。これも例によって何も起きません。

checkBox(label=”One”)がチェックボックスを作成する命令のようです。

最後にスライダーです。
import pymel.core as pm
pm.window()
pm.columnLayout(adjustableColumn=True)
pm.floatSlider()
pm.floatSlider(max=100, step=1, value=0, min=-100)
pm.showWindow()

実行すると、以下のようなウインドウが出てきて、2本のスライダが出てきてドラッグすると、動かせます。

floatSlider(max=100, step=1, value=0, min=-100)という命令で、スライダーを表示し、-100~100の変化を付け、1つづ変化をしていき、最初は0から開始する、という意味です。

それぞれのUI要素は解りました。でもどれも何も動かないので、実際に使えるように改造していくのが次回のお話しです。
お楽しみに!