スタジオブロス TECH BLOG

スタジオブロススタッフからの最新ツール情報やチュートリアル・TIPSなどを紹介します

文系デザイナーのための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(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が受け付けないこともあるので注意です。

今回はここまでです。