2016-05-22 8 views
3

Ich versuche, eine Eigenschaft mithilfe der Blender Python-API festzulegen und sie zu einem RotationSyncFinalValue Liste hinzuzufügen. Die Liste ist so eingestellt, wie es sein muss, aber die Eigenschaft aktualisiert sich nicht, daher zeigt die Liste den Wert nicht an.Blender-Eigenschaft wird bei Bedarf nicht aktualisiert (Python)

Hier ist der Code, wo ich die Immobilie zu definieren:

atr = bpy.types.Scene 
RotationSyncFinalValue = [] 
atr.RotationSyncValuesList =EnumProperty(
items= RotationSyncFinalValue, 
name = "List", 
description = "Select The Action to Do with the Value") 

Hier ist, wo ich die Eigenschaft in dem Panel eingestellt:

layout = self.layout 
scene = bpy.context.scene 
col.prop(scene,"RotationSyncValuesList") 
col = layout.column(align=True) 

Und das ist mein Versuch, einen Wert zu dem Array hinzufügen RotationSyncFinalValue

fvalue = ('{0:.4f}'.format(value), 
'{0:.4f}'.format(value), 
'{0:.4f}'.format(value)) 
RotationSyncFinalValue.extend([fvalue]) 

Antwort

0

Sie verwenden den falschen Typ für die Aufgabe. Eine EnumProperty ist ein einzelner Wert, der in einer definierten Liste zulässiger Werte vorhanden sein muss. Die Liste der Elemente, die an den Konstruktor übergeben werden, ist eine Liste von Werten, die für die Eigenschaft akzeptabel sind. Werte, die nicht in der ursprünglichen Liste enthalten sind, können nicht zugewiesen werden Eigentum.

Ich erwarte, dass Sie bei dem Beispiel für CollectionProperty gegeben aussehen wollen, um am Ende mit so etwas wie - in Ihrem Panel

class RotationSyncValuesType(bpy.types.PropertyGroup): 
    x = bpy.props.FloatProperty(name='x', default=0.0) 
    y = bpy.props.FloatProperty(name='y', default=0.0) 
    z = bpy.props.FloatProperty(name='z', default=0.0) 

bpy.utils.register_class(RotationSyncValuesType) 
bpy.types.Scene.RotationSyncValuesList = \ 
     bpy.props.CollectionProperty(type=RotationSyncValuesType) 

fvalue = bpy.context.scene.RotationSyncValuesList.add() 
fvalue.x = 1.0 
fvalue.y = 1.0 
fvalue.z = 1.0 

fvalue = bpy.context.scene.RotationSyncValuesList.add() 
fvalue.x = 2.0 
fvalue.y = 2.0 
fvalue.z = 2.0 

Dann könnten Sie verwenden -

for p in scene.RotationSyncValuesList: 
    row = col.row() 
    row.prop(p, 'x') 
    row.prop(p, 'y') 
    row.prop(p, 'z') 

Wie Sie wollen erscheinen drei Eigenschaften mit dem gleichen Wert, die Sie mit custom get/set functions betrachten sollten, dies könnte sicherstellen, dass alle drei Eigenschaften synchron bleiben (oder nur einen Wert speichern), würden Sie das Get/Set zu den Eigenschaften in der PropertyGroup-Klasse hinzufügen.

0

Wenn Sie ein Array wie erwähnt verwenden, können Sie in den Dokumenten nachsehen und verstehen, dass mit einem Array-Objekt keine Liste an diese Funktion übergeben werden kann.

array.extend (iterierbar) Elemente an das Ende des Arrays anfügen. Wenn iterable ein anderes Array ist, muss es genau denselben Typcode haben. Wenn nicht, wird TypeError ausgelöst. Wenn iterable kein Array ist, muss es iterierbar sein und seine Elemente müssen vom richtigen Typ sein, der an das Array angehängt wird. https://docs.python.org/2/library/array.html

Wenn es ein Tippfehler und RotationSyncFinalValue ist eine Liste war, fügen Sie bitte weitere Informationen, so dass wir Ihnen helfen.

Verwandte Themen