忘却まとめ

Blenderの中級者・上級者向けの踏み込んだ情報や、アドオン・3DCGに関する情報を記事にします

【Python入門 02】 変数・if・forなどプログラミングの基本について【Blender】

Python

更新日:

プログラミングの基本的な要素について紹介する。
すべて覚えなくても最低でも変数とif文が分かれば、既存のコードが多少は読めるようになる。人のコードが読めればそこから学ぶことができる。

前回

変数

変数 = 対象

エヴァ = "汎用人型決戦兵器"

長い文を省略したい場合などに、代わりの呼び名を付けること。
左が変数で、右が変数にする対象なことに注意。
一文字目に数値(0~9)は使用することができない 。

サンプルコード

sc = bpy.context.scene
vl = bpy.context.view_layer
obj = bpy.context.object
vg = obj.vertex_groups[0]
mat = obj.data.materials[0]

頻繁に使うものは、最初に代入しておくとよい。
コードを短くわかりやすくすることができる。
変数にする名前を「obj」など決まったものにしておくと、コードの流用がしやすくなるし自分の中でもわかりやすくなる。

変数で状態を保存する

contextのような、随時変化する要素を一旦保存しておくこともできる。

例えば、キューブを作成すると選択が移ってしまうので、作成前に現在のアクティブオブジェクトを保存しておいて、 保存しておいた変数を使って再度アクティブ選択を復元することができる。

# 文字列を設定したい場合は、""で囲う
hoge = "hugahuga"

# 現在のアクティブオブジェクトを、old_actとして保存しておく
old_act = bpy.context.view_layer.objects.active

# キューブを作成すると選択が移る
bpy.ops.mesh.primitive_cube_add()

# 選択を復元する
old_act.select_set(True)

# アクティブ選択を復元する
# = を使っていて、変数と同じ書き方のように見えるが、これは「アクティブオブジェクトをold_actにします」と書いている
bpy.context.view_layer.objects.active = old_act

print - 確認する

print(対象)

対象の中身を確認できる。
あくまでプログラミングしてる人が状況を確認するための補助に使うものなので、最終的なコードには必須ではない。

主に、どの箇所で問題が起きているのか確認したい時に利用することが多い。
プログラミングは一瞬で動作するため、データが途中でどのように切り替わっているのか把握しづらいので、確認したい時にprint()が便利。

サンプルコード

変数の中身がなんだったか確認したいときに使える。

# 現在選択中のものを"hoge"にすえる
hoge = bpy.context.selected_objects

# printでhogeの中身を確認する
print(hoge)

IF 文 - 条件分岐

if

if 〇〇 == ××:
処理

もし、〇〇が××ならば処理を実行する。
"=" ではなく "==" なことに注意。

例えば、オブジェクトタイプが特定のタイプでない場合に実行するとエラーが出るような動作を、ifで回避しながら実行することができる。

下記のソースコードでは、メッシュ以外のエンプティやライトなどにモディファイアを設定する事はできないため、あらかじめメッシュだけに動作するように条件を絞り込んでいる。

# 選択オブジェクトのタイプが、メッシュの場合は、
if bpy.context.object.type == "MESH":
    # ベベルとサブディビジョンを設定する
    bpy.ops.object.modifier_add(type="BEVEL")
    bpy.context.object.modifiers["Bevel"].segments = 3
    bpy.ops.object.subdivision_set(level=2)

if not ◯◯:

条件に当てはまらない場合に処理を実行する。
逆の条件のみ動作させたい場合に便利。
if not obj.type == "MESH": とすれば、メッシュ以外のオブジェクトを対象にする。

elif

elif 〇〇 == ××:
 処理

前にあるif文の条件に当てはまらない場合は、次のelifの条件を試す。
if文を何度か続けたい場合は、まず最初に「if」がある必要があり、それ以降は「elif」と書く。

if ...:
elif ...:
elif ...:
elif ...:
...

「if」の連続にすると、別の条件分岐として扱われるので注意。

if ...:
if ...:
if ...:
...

else

else:

if文のどれにも当てはまらない場合は実行する。
条件分岐の最後の分岐として書くこと。

if ...:
elif ...:
elif ...:
else:

サンプルコード

# 選択オブジェクトのタイプがライトの場合は、ライトカラーを赤くする
# メッシュの場合は、配列複製を設定する
# それ以外は、削除する

    
if bpy.context.object.type == "MESH":
    bpy.ops.object.modifier_add(type='ARRAY')
elif bpy.context.object.type == "LIGHT":
    bpy.context.object.data.color = (1, 0, 0)
else:
    bpy.ops.object.delete()

比較演算子 - いろいろな条件指定

条件分岐の == の部分には、他にも様々なものが存在する。
すべてを覚えなくても、== と not があれば大抵はやっていける

記号描き方意味
andx and yxとy全てに当てはまる場合
orx or yxとyどちらか1つでも当てはまる場合
==x == yxとyが等しい場合
!=
not
x != y
if not x == y:
xとyは等しくない場合
書き方が2つあるがどちらも同じ
>x > yxはyより大きい場合
>=x >= yxはy以上の場合
<x < yyはxより大きい場合
<=x <= yyはx以上の場合

小ネタ

if hoge == True: は、Trueの場合は省略して書くことができるので、
if hoge: のように書くことができる。

True は 1 、False は 0 と書くことができる。

for 文 - 繰り返し

for 変数 in 対象:
変数.操作内容など

複数に対して一括操作できるもの。
手動では手間な一括処理ができるので、プログラミングを軽く実用したいならこれが一番便利で実用的。

if文を活用するとより複雑なコードが書ける。

  • [対象]に一括して同じ処理を行いたい時に使う。
  • [対象]に対して1つ1つ処理していく。
  • [対象]の個数分処理が行われる。
  • [変数]の文字列はなんでもいい。

サンプルコード

#  現在の選択物をすべて選択解除する
for o in bpy.context.selected_objects:
    o.select_set(False)


# 説明
# 現在の選択オブジェクト
bpy.context.selected_objects

# 選択オブジェクトを変数にしたもの。文字は何でもいい。今回は Object の o にした
o

# 選択オブジェクトの選択を解除する
o.select_set(False)

アドオンの制作依頼はこちら

-Python
-, , ,

Copyright© 忘却まとめ , 2024 All Rights Reserved Powered by STINGER.