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

今回はチェックボックスと文字入力です。
今日の最初のプログラムはこんな感じです。

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(xi*i)+str(yi*i)+str(zi*i))
というようにCubeを作るときにn=”???”と書くとオブジェクト名になるのです。
“myBox”+”_”+cnで文字を足し算します。文字の足し算は意味不明かもしれませんが、文字が連結すると考えればOKです。
xi,yi,ziは引数のmoveの移動量ですね。これは数値なので文字の足し算(連結)できません。そこでstrという関数に入れると、数値を文字に変更してくれるのです。
でもstrって関数は作ってませんね?これはPythonに初めから入っている関数なのです。
これを「Python標準ライブラリ」といって非常に便利な道具がそろっています。

なので、fukanoとテキストフィールドで入力して、xi*i,yi*i,zi*i=0,-1,0だと
オブジェクト名は「myBox_Fukano0_10」になります。
「-」はMayaでは使えないので自動で「_」に変更されてしまいました。このようにPythonとしては処理できてもMayaが受け付けないこともあるので注意です。

今回はここまでです。

コメントを残す