スクリーンショット_2019-08-27_02

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

そうですね。ではタイプがMESHLIGHTを処理対象とする場合は?

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

お読みいただきありがとうございます。サポートいただいた分はおやつのグレードアップに使おうかと思います。スキ、SNSにシェアもよろしくお願いします!