今回はチェックボックスと文字入力です。
今日の最初のプログラムはこんな感じです。
1から10行目までは前回とあまり変化なく、スライダー作成するだけです。
11行目からですが、これもそんなに違いはありません。For命令でスライダーの値のマイナスから繰り返しています。
def makeCube(): hei=pm.intSliderGrp(boxH,q=True,value=True) for i in range(-1*hei,hei+1): print i pm.polyCube(w=0.9,h=0.9,d=0.9) pm.move(0,0,i)
なので、スライダーが3だと、-3,-2,-1,0,1,2,3と7回繰り返し、Cubeは-3から3まで7個作成され、0.9なので少し隙間ができます。
では、これを改造して以下のようにします。ちょっと長いですが、良く見てください。
実行すると、チェックボックスができるのでXをOnにして実行します。
XとZをOnで4つ
XYZ全部Onで5つ。好きな項目をOn/Offできる機能が付きました。
プログラムは長いですが、新しい箇所は少ないです。
7~9行目で、
checkBox1 = pm.checkBox(label='X') checkBox2 = pm.checkBox(label='Y') checkBox3 = pm.checkBox(label='Z')
だけでチェックボックスが表示されます。簡単ですね。
あとは、その3つの変数を、関数の方の19,23,27行目でif分で判断しているだけです。
if checkBox1.getValue(): if checkBox2.getValue(): if checkBox3.getValue():
ifが3つですから、チェックボックスがOnのものは全部実行されるのです。
でも良く見てください。それぞれのifの下の3行はほとんど同じですよね?
それぞれの最後の行、22,26,30だけX,Y,Zのどれを移動するかの違いです。
これはムダで美しくありません。
それとこれはバグがあるんです。これだと、0,0,0の位置のCubeは複数あることになりますね。
では、17行め以降を書き換えます。
ほぼ同じことを3回やるので、これをcopyCubeという新しい関数にします。
def copyCube(hei,xi,yi,zi): for i in range(-1*hei,hei+1): if i != 0: pm.polyCube(w=0.9,h=0.9,d=0.9) pm.move(xi*i,yi*i,zi*i)
heiの引数を受け取って、Cubeを複数作って、,xi,yi,ziの引数でmoveで移動させる仕組みです。
さらに0の場合ダブって作るバグを取るため、if i != 0:で回避しています。
i != 0は「ゼロでなければ」という意味で「!」を使うのです。つまりゼロでない時だけCubeを作るのです。
それに併せて関数makeCubeを改造します。
def makeCube(): hei=pm.intSliderGrp(boxH,q=True,value=True) if checkBox1.getValue(): copyCube(hei,1,0,0) if checkBox2.getValue(): copyCube(hei,0,1,0) if checkBox3.getValue(): copyCube(hei,0,0,1)
無駄に繰り返していた部分をcopyCubeに変更して、スッキリしています。
実行結果は・・・原点が空になるだけで、さっきと同じです。
変化がないなら意味がない!とは思わないでください。プログラムは動くことが基本ですが、その後のメンテナンスや改造がしやすいことが大切です。
プロの人でも何日か経ったプログラムを見ると、何をやっていたか解らなくなることもあるのです。
初心者の多くが頑張って長いプログラムを書いてしまい、
1)後で直すことができない
2)どうやって動いているか解らない
3)バグが見つからない
ことから挫折するのです。なるべく関数で処理を分解して、小さい単位で作成することを強くお勧めします。
階段を上がるのは小さな段差なら楽ですよね。
では、もうちょっと改造してみます。
長くなった・・・ようですが、追加したのは13行と29、32行のたった3行です。
実行すると、文字を入れる個所ができて、その通りにオブジェクト名を自動で設定するテキストフィールドという機能です。
13行の boxname=pm.textFieldGrp(l="CubeName",editable=True) textFieldGrpが文字を入れる機能で、変数boxnameに代入します。
29行でそれを受け取り、変数cnに入れます。
cn=pm.textFieldGrp(boxname,q=True,text=True)
32行でpm.polyCube(w=0.9,h=0.9,d=0.9,n="myBox"+"_"+cn+str(xii)+str(yii)+str(zi*i))
というようにCubeを作るときにn="???"と書くとオブジェクト名になるのです。
"myBox"+"_"+cnで文字を足し算します。文字の足し算は意味不明かもしれませんが、文字が連結すると考えればOKです。
xi,yi,ziは引数のmoveの移動量ですね。これは数値なので文字の足し算(連結)できません。そこでstrという関数に入れると、数値を文字に変更してくれるのです。
でもstrって関数は作ってませんね?これはPythonに初めから入っている関数なのです。
これを「Python標準ライブラリ」といって非常に便利な道具がそろっています。
なので、fukanoとテキストフィールドで入力して、xii,yii,zi*i=0,-1,0だと
オブジェクト名は「myBox_Fukano0_10」になります。
「-」はMayaでは使えないので自動で「_」に変更されてしまいました。このようにPythonとしては処理できてもMayaが受け付けないこともあるので注意です。
今回はここまでです。