
[BPY28]複数タイプを対象とするときの話
いきなりですが、インタラクティブコンソール上で現在選択しているオブジェクトのタイプを列挙するスクリプトは書けますか?
こうですね。
objs = C.selected_objects
for x in objs:
print(x,x.type)
例えばデフォルトシーンで全て選択してスクリプト実行した場合の出力はこうなりますね。
>>> objs = C.selected_objects
>>> for x in objs:
... print(x,x.type)
...
<bpy_struct, Object("Cube")> MESH
<bpy_struct, Object("Light")> LIGHT
<bpy_struct, Object("Camera")> CAMERA
>>>
では、タイプがMESHの場合にのみ処理をする場合にはどう書きますか?
こう?
objs = C.selected_objects
for x in objs:
if x.type == 'MESH':
print(x,x.type)
そうですね。ではタイプがMESHとLIGHTを処理対象とする場合は?
orでつないで、こう?
objs = C.selected_objects
for x in objs:
if x.type == 'MESH' or x.type == 'LIGHT' :
print(x,x.type)
ではさらにタイプがCURVEのものも対象にしたい場合は?
orをさらに追加?でもこれ条件文のところが長くなりますね。
objs = C.selected_objects
for x in objs:
if x.type == 'MESH' or x.type == 'LIGHT' or x.type == 'CURVE' :
print(x,x.type)
そういう場合にはこう書いてはどうでしょうか。
TARGET_TYPE = ('MESH','LIGHT','CURVE')
objs = C.selected_objects
for x in objs:
if x.type in TARGET_TYPE :
print(x,x.type)
タプル + in構文ですね。
----[追記]----
「フラグを使う」という方法もあります。これは「オブジェクトタイプに加えて他の条件が複雑に絡む」時に使う可能性はありますが、今回のケースでは「大げさ」ですね。手段としてある、と覚えておく程度で。
objs = C.selected_objects
for x in objs:
f = False
t = x.type
if t == 'MESH':
f = True
if t == 'LIGHT':
f = True
if t == 'CURVE':
f = True
if f :
print(x,x.type)
このくらい書いたらもう関数として外に出しとかないとね。
def is_need_to_operate(obj):
f = False
t = obj.type
if t == 'MESH':
f = True
if t == 'LIGHT':
f = True
if t == 'CURVE':
f = True
return(f)
objs = C.selected_objects
for x in objs:
f = False
if is_need_to_operate(x) :
print(x,x.type)
また、バリエーションとして「メイン処理側を外出し」というのもあるっちゃあります。こう。
def do_hogehoge(obj):
print(obj,obj.type)
objs = C.selected_objects
for x in objs:
f = False
t = x.type
if t == 'MESH':
do_hogehoge(x)
if t == 'LIGHT':
do_hogehoge(x)
if t == 'CURVE':
do_hogehoge(x)
-----
えっ、なになに、「elif ~ else は使わないのか?」ですって?そこは今回は本題ではないので(パフォーマンス面でそう書いた方がいいのはわかります)。こう書け、って言いたいんですよね?
f = False
if t == 'MESH':
f = True
elif t == 'LIGHT':
f = True
elif t == 'CURVE':
f = True
else:
f = False
いいなと思ったら応援しよう!
