Added some python API examples for the new get/set callbacks in bpy.props.
authorLukas Toenne <lukas.toenne@googlemail.com>
Sat, 5 Jan 2013 15:50:51 +0000 (15:50 +0000)
committerLukas Toenne <lukas.toenne@googlemail.com>
Sat, 5 Jan 2013 15:50:51 +0000 (15:50 +0000)
doc/python_api/examples/bpy.props.5.py [new file with mode: 0644]

diff --git a/doc/python_api/examples/bpy.props.5.py b/doc/python_api/examples/bpy.props.5.py
new file mode 100644 (file)
index 0000000..e49d0f2
--- /dev/null
@@ -0,0 +1,85 @@
+"""
+Get/Set Example
+++++++++++++++
+
+Get/Set functions can be used for boolean, int, float, string and enum properties.
+If these callbacks are defined the property will not be stored in the ID properties
+automatically, instead the get/set functions will be called when the property is
+read or written from the API.
+"""
+
+import bpy
+
+
+# Simple property reading/writing from ID properties.
+# This is what the RNA would do internally.
+def get_float(self):
+    return self["testprop"]
+
+def set_float(self, value):
+    self["testprop"] = value
+
+bpy.types.Scene.test_float = bpy.props.FloatProperty(get=get_float, set=set_float)
+
+
+# Read-only string property, returns the current date
+def get_date(self):
+    import datetime
+    return str(datetime.datetime.now())
+
+bpy.types.Scene.test_date = bpy.props.StringProperty(get=get_date)
+
+
+# Boolean array. Set function stores a single boolean value, returned as the second component.
+# Array getters must return a list or tuple
+# Array size must match the property vector size exactly
+def get_array(self):
+    return (True, self["somebool"])
+
+def set_array(self, values):
+    self["somebool"] = values[0] and values[1]
+
+bpy.types.Scene.test_array = bpy.props.BoolVectorProperty(size=2, get=get_array, set=set_array)
+
+
+# Enum property.
+# Note: the getter/setter callback must use integer identifiers!
+test_items = [
+    ("RED", "Red", "", 1),
+    ("GREEN", "Red", "", 2),
+    ("BLUE", "Red", "", 3),
+    ("YELLOW", "Red", "", 4),
+    ]
+
+def get_enum(self):
+    import random
+    return random.randint(1, 4)
+
+def set_enum(self, value):
+    print("setting value", value)
+
+bpy.types.Scene.test_enum = bpy.props.EnumProperty(items=test_items, get=get_enum, set=set_enum)
+
+
+# Testing
+
+scene = bpy.context.scene
+
+scene.test_float = 12.34
+print (scene.test_float)
+
+scene.test_array = (True, False)
+print ([x for x in scene.test_array])
+
+#scene.test_date = "blah"   # this would fail, property is read-only
+print (scene.test_date)
+
+scene.test_enum = 'BLUE'
+print (scene.test_enum)
+
+
+# >>> 12.34000015258789
+# >>> [True, False]
+# >>> 2013-01-05 16:33:52.135340
+# >>> setting value 3
+# >>> GREEN