こんにちは!ビーバー@ゲーム業界歴約20年 です。maya python初心者の方のために、カンタン・わかりやすい解説サイトを作っています。
maya pythonの学習情報って少ないですよね。自分が骨を折った経験をもとに、maya python基礎を最速で習得できる10回のチュートリアルを作ってみたので参考にしていただければ幸いです。
今回は、6回目。チェックツールを作りながら、条件に応じて処理を変える方法(条件分岐)を学んでいきます。
※当サイトで紹介する商品は、アフィリエイトプログラムを利用しています。
ロックされたアトリビュートを見つけるチェックツール
それでは、ツールを作ってみましょう!ツールの要件は以下とします。
- 9つのアトリビュートのロック状態をチェック
(transXYZ,rotXYZ,scaleXYZ) - ロック有なら、アトリビュート名と「locked」の文字列を表示する
スクリプトの動作を確認するために、tx,rx,sxだけロックされたpSphere1のシーンを用意します。
今回も、まず完成したスクリプトを見てから、内容を解説していきます。
attrs = ["tx","ty","tz","rx","ry","rz","sx","sy","sz"]
for attr in attrs:
lock_check=cmds.getAttr("pSphere1."+attr,lock=True)
if lock_check == True:
print(attr,"locked")
な、長い、、、もうだめだ
大丈夫だよ(汗)1行ずつ分けて見ていこうね
アトリビュート値の取得
まずは一つのアトリビュートがロック状態かどうかを判別する1行を書いてみましょう。
getAttrというコマンドを使います。
- コマンド名「getAttr」
指定したオブジェクトのアトリビュート値を返します。 - フラグ名「lock」
アトリビュートのロックされた状態を返します。引数タイプはboolean
アトリビュートを取得する対象のオブジェクトはこのように指定します。
cmds.getAttr(“オブジェクト名.アトリビュート名“,フラグ=○○)
()の中にオブジェクト名ドットアトリビュート名だね!
pSphere1のtransXアトリビュートのロック状態を取得するには、↓このように書きます。
cmds.getAttr("pSphere1.translateX",lock=True)
結果がTrueと帰ってきていますので、pSphere1のtransXはロックしているということがわかります。
アトリビュート名は長くなりがちだから、
.translateXは.txって略せるよ。以下の説明は省略版を使うね。
先ほどの一文を扱いやすいように、lock_checkという変数に入れます。
lock_check=cmds.getAttr("pSphere1.tx",lock=True)
ロックの有無で処理を実行
if文を使ってみよう
次に、アトリビュートのロック状態がTrueなら
「locked」と文字列を表示するスクリプトを書いてみましょう。
以下のように書きます。
if lock_check == True:
print("locked")
if?初めての文が出てきたよ。これはどういうものなの~?
if文を使うことで条件分岐を入れることができるんだよ。
詳しく見ていこう!
if文の書式を解説します。
if ○○○○○:
␣␣␣␣○○○○○が正しければ処理を実行する
if のすぐ後に条件を書き、:(コロン)で1行目が終了。
2行目はインデントの後に、1行目の条件が正しければ実行する処理を記入します。
for文と同じく、インデントを正しく入れるように注意しましょう。
条件の書き方を解説します。
if lock_check == True:
print("locked")
lock_check == True 部分が条件です。
lock_checkがTrueであれば2行目の処理を実行する、という意味になります。
「==」は比較演算子といいます。
ヒカクエンザンシ・・・・?
数学で使う大なり小なりに似ているよ。
主なものをまとめるね。
記号 | 内容 |
== | 左辺と右辺が等しい |
< | 左辺より右辺が大きい |
<= | 左辺が右辺以下 |
> | 左辺が右辺より大きい |
>= | 左辺が右辺以上 |
左辺と右辺が同じなのは、どうして「=」イコールひとつじゃないの?
=(イコール一つ)は、「右辺の中身を左辺に入れてね」という意味なんだ。
変数の定義の時に使ったね。
だから、左辺右辺が同じ場合は、「==」で書くんだ!
if文の例
比較演算子を使った条件の例を見てみましょう。条件が正しい場合の例を挙げます。
if 0<1:
print("1は0より大きい")
0<1 この条件は正しいので、2行目のprintコマンドが実行されます。
正しくprintされました。
if 文が正しくない場合に実行したい処理がある場合は
どう書けばいいの?
それは「else」を使うんだよ!
else文の書式を解説します。
if ○○○○○:
␣␣␣␣○○○○○が正しければ処理を実行する
else:
␣␣␣␣○○○○○が正しくない時に処理を実行する
ifの後ろの条件が正しくない時は、2行目を飛ばして、
else以降に書かれた処理を実行するという挙動になります。
下記の例を見てください。
if 0>1:
print("1は0より大きい")
else:
print("条件は正しくないのでelseの内容を実行します")
0>1 この条件は正しくないので、else以降のprintコマンドだけが実行されています。
if 文の書き方がわかったよ!
じゃあ、pSphere1のアトリビュートのロック状態がTrueなら
「locked」と文字列を表示させたい場合、はこう書けばいいんだね。
lock_check=cmds.getAttr("pSphere1.tx",lock=True)
if lock_check == True:
print("locked")
大正解~~~!!
9アトリビュートで処理をまわすには?
そういえば、、さっきのスクリプトは transXのロック状態しか判別してないね。
transXYZ,rotXYZ,scaleXYZ を判別するにはどうしたらいいんだろう。。
5限目で覚えたfor文を使えばいいんだよ!
そうか!複数のものに対して、同じ処理を走らせるfor文を使えばいいんだ!
冒頭でで提示した、ツールの要件をもう一度おさらいしましょう。
- 9つのアトリビュートのロック状態をチェック
(transXYZ,rotXYZ,scaleXYZ) - ロック有なら、アトリビュート名と「locked」の文字列を表示する
ロック判定を9アトリビュート分やるには、対象のアトリビュートをリストにする必要があります。
5限目では、リストは lsコマンドで取得したものを変数化することで作成していましたが、
この場合は、下記のように直に書くことでリストを定義します。
attrs = ["tx","ty","tz","rx","ry","rz","sx","sy","sz"]
このあと、リストの要素が”pSphere1.○○”の○○に順番に入っていくようにするんだね。
そうだよ!for文にするとこうなるんだ
for attr in attrs:
lock_check=cmds.getAttr("pSphere1."+attr,lock=True)
if lock_check == True:
print(attr,"locked")
pSphere.○○の部分にattrsの要素が入ってほしいから、”pSphere1.”+attr
printする文字列は、「アトリビュート名,locked」としたいので attr,”locked” としています。
それでは実行結果を見てみましょう!
狙い通りの結果が返ってくるようになりました!
やったあ!ほんとにできちゃったよ!
最後に、この回のスクリプトの全体をもう一回おさらいします。
attrs = ["tx","ty","tz","rx","ry","rz","sx","sy","sz"]
for attr in attrs:
lock_check=cmds.getAttr("pSphere1."+attr,lock=True)
if lock_check == True:
print(attr,"locked")
一見難しそうに見えるけど、今まで勉強してきた内容の組み合わせだよ!
まとめ
今回学習した内容のポイントをまとめます。
次回は、オブジェクトの整列を通して学習を進めたいと思います。
オススメの本。pythonが楽しく学べます☆
コメント