2016-08-26 8 views
0

キューブの面と同じ番号のブレンダープロパティを定義する際に、手動でそれらを無視することはありません。サイクル内のブレンダーのプロパティを定義する

したがって、このような何か:

atr = bpy.types.Scene 
for i in range(0,20): 
    //Define a intProperty to do stuffs. 

とパネル描画機能で個別にそれらを呼び出すことは可能ですか?

+0

[この質問](http://blender.stackexchange.com/q/54038/935)には、新しいプロパティの作成例が含まれています。 – sambler

+0

サイクルでプロパティをどのように作成できるのか疑問に思っていましたが、その質問を見ましたが、どのような方法でも答えは見つけられません。 – Fabrizio

答えて

0

新しいプロパティをブレンダーのオブジェクトに追加するには、2つの方法があります。単純な動的な方法は、オブジェクトが辞書であるかのようにキーに値を割り当てることによってcustom propertiesを使用することです。これは、object propertiesのカスタムプロパティパネルを使用する場合と同じです。あなたは辞書のスタイルを使用し続けるあなたのスクリプトでこの値にアクセスするには - obj['myprop0']

import bpy 
obj = bpy.context.object 
for i in range(0,20): 
    obj['myprop'+str(i)] = i 

あなたは、たとえば専用のプロパティにint型を割り当てることができるように型チェックができ、より構造化された方法は、property to the object class definitionを追加することですこれらはカスタムプロパティパネルにも表示されますが、「API定義」として表示されます。生成されたプロパティ名でこれを行うには、生成するコードを実行する必要があります。このメソッドは、クラス定義内の他のプロパティと同じようにアクセスし、真のプロパティを作成します - obj.myprop0

import bpy 
for i in range(0,20): 
    cmd = 'bpy.types.Object.myprop{} = bpy.props.IntProperty()'.format(i) 
    exec(compile(cmd, 'myprops', 'exec')) 

は、両方のアプローチは、同じ名前空間を占有するので、あなたは両方の方法で同じプロパティ名を使用する場合はすることに注意してください同じプロパティにアクセスする必要があり、プロパティを表示する両方のメソッドが機能します。 bpy.propsの定義は、辞書スタイルのプロパティよりも優先されます。

各アプローチは、パネルにプロパティを表示するときに少しずつ異なってアクセスされます。辞書スタイルプロパティの場合はrow.prop(obj,'["myprop'+str(i)+'"]')を使用し、bpy.propsの場合はを使用します。最初の方法では、辞書値にアクセスするのと同じように[]に含まれるプロパティ名を使用します。

import bpy 
class myPanel(bpy.types.Panel): 
    """Creates a Panel in the Object properties window""" 
    bl_label = "My properties Panel" 
    bl_idname = "OBJECT_PT_myprops" 
    bl_space_type = 'PROPERTIES' 
    bl_region_type = 'WINDOW' 
    bl_context = "object" 

    def draw(self, context): 
     layout = self.layout 
     obj = context.object 

     row = layout.row() 
     row.label('dynamic properties') 
     for i in range(0,20): 
      row = layout.row() 
      row.prop(obj,'["myprop'+str(i)+'"]') 

     row = layout.row() 
     row.label('structured properties') 
     for i in range(0,20): 
      row = layout.row() 
      row.prop(obj,'myprop'+str(i)) 

bpy.utils.register_class(myPanel) 
関連する問題