2016-08-26 44 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

有兩種方法可以將新屬性添加到攪拌器中的對象。一種簡單的動態方法是使用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時,請使用row.prop(obj,'myprop'+str(i)) - 請注意,第一種方法使用[]中包含的屬性名稱,如訪問任何字典值。

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)