【maya python6限目】ロックされたアトリビュートを見つけるチェックツールを作ってみよう

mayapy06 python入門
セミナーのお知らせ

6/7(金)のセミナーは無事終了しました。
受講いただいた皆様、ありがとうございました。次回のセミナーもお楽しみに!

CGWORLD +ONE Knowledge
【スクリプトで広がる世界】わかる!はじめてのMayaPython
 https://tutorials.cgworld.jp/con/1905?from_category_id=48

こんにちは!ビーバー@ゲーム業界歴約20年 です。maya python初心者の方のために、カンタン・わかりやすい解説サイトを作っています。

maya pythonの学習情報って少ないですよね。自分が骨を折った経験をもとに、maya python基礎を最速で習得できる10回のチュートリアルを作ってみたので参考にしていただければ幸いです。

今回は、6回目。チェックツールを作りながら、条件に応じて処理を変える方法(条件分岐)を学んでいきます。

このチュートリアルでわかること
  • アトリビュートのロックの有無を取得する方法
  • 条件分岐を行う方法
  • 「リスト」を作る方法
  • くりかえし処理と条件分岐を組み合わせた処理の作り方

>> Pythonの勉強方法を知りたい方はこちらをどうぞ

※当サイトで紹介する商品は、アフィリエイトプログラムを利用しています。

ロックされたアトリビュートを見つけるチェックツール

それでは、ツールを作ってみましょう!ツールの要件は以下とします。

  • 9つのアトリビュートのロック状態をチェック
    (transXYZ,rotXYZ,scaleXYZ)
  • ロック有なら、アトリビュート名と「locked」の文字列を表示する

スクリプトの動作を確認するために、tx,rx,sxだけロックされたpSphere1のシーンを用意します。

mayapy06_01

今回も、まず完成したスクリプトを見てから、内容を解説していきます。

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)
scriptEditor

結果が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コマンドが実行されます。

scriptEditor

正しくprintされました。

ピヨちゃん
ピヨちゃん

if 文が正しくない場合に実行したい処理がある場合は
どう書けばいいの?

ハムちゃん
ハムちゃん

それは「else」を使うんだよ!

else文の書式を解説します。

if ○○○○:
␣␣␣␣○○○○○が正しければ処理を実行する

else:
␣␣␣␣○○○○○が正しくない時に処理を実行する

ifの後ろの条件が正しくない時は、2行目を飛ばして、
else以降に書かれた処理を実行するという挙動になります。
下記の例を見てください。

if 0>1:
    print("1は0より大きい") 
else:
    print("条件は正しくないのでelseの内容を実行します")
scriptEditor

0>1 この条件は正しくないので、else以降のprintコマンドだけが実行されています。

ピヨちゃん
ピヨちゃん

if 文の書き方がわかったよ!
じゃあ、pSphere1のアトリビュートのロック状態がTrueなら
「locked」と文字列を表示させたい場合、はこう書けばいいんだね。

lock_check=cmds.getAttr("pSphere1.tx",lock=True)
if lock_check == True:
    print("locked")
scriptEditor
ハムちゃん
ハムちゃん

大正解~~~!!

\楽天ポイント5倍セール!/
楽天市場

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” としています。

それでは実行結果を見てみましょう!

scriptEditor

狙い通りの結果が返ってくるようになりました!

ピヨちゃん
ピヨちゃん

やったあ!ほんとにできちゃったよ!

最後に、この回のスクリプトの全体をもう一回おさらいします。

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")
ハムちゃん
ハムちゃん

一見難しそうに見えるけど、今まで勉強してきた内容の組み合わせだよ!

まとめ

今回学習した内容のポイントをまとめます。

学習のポイント
  • getAttrを使ってロックの有無を取得
  • if文で条件分岐して処理を実行
  • リストの作成
  • for文とif文の組み合わせで処理を作る

次回は、オブジェクトの整列を通して学習を進めたいと思います。

はじめてpython学習するなら!

はじめてプログラミングを勉強するとき、エラーはつきものですよね。
何時間もスクリプトが動かないこともしばしば。。
そんな時、くわしい人に教えてもらいたい、と思うことはありませんか?

侍テラコヤは、はじめてpythonを学習する方にピッタリのサービスです。
サブスク型オンラインスクールで、月¥2980~の良心的なお値段!

現役エンジニアのサポートが充実しており、
オンラインのマンツーマンレッスンとQ&A掲示板で即座に悩みを解決することができます

maya python基礎

本サイトの【まとめ】 maya python 基礎 入門!では、
10回シリーズでmaya pythonの基礎が習得できるコンテンツを発信しています。

  • ちまたのスクリプトを読んで、内容を理解したい
  • mayaのスクリプトリファレンスの読み方を習得したい
  • 自分で簡単なツールを書きたい
  • 基礎的なmayaコマンドをpythonで使えるようになりたい

など、mayaでpython基礎を身に着けたい方は、ぜひご活用ください♪

オススメの本。pythonが楽しく学べます☆

\楽天ポイント5倍セール!/
楽天市場

コメント

タイトルとURLをコピーしました