Updated bpy.props getter/setter example
[blender-staging.git] / doc / python_api / examples / bpy.props.5.py
1 """
2 Getter/Setter Example
3 +++++++++++++++++++++
4
5 Getter/setter functions can be used for boolean, int, float, string and enum properties.
6 If these callbacks are defined the property will not be stored in the ID properties
7 automatically. Instead, the `get` and `set` functions will be called when the property
8 is respectively read or written from the API.
9 """
10 import bpy
11
12
13 # Simple property reading/writing from ID properties.
14 # This is what the RNA would do internally.
15 def get_float(self):
16     return self["testprop"]
17
18
19 def set_float(self, value):
20     self["testprop"] = value
21
22 bpy.types.Scene.test_float = bpy.props.FloatProperty(get=get_float, set=set_float)
23
24
25 # Read-only string property, returns the current date
26 def get_date(self):
27     import datetime
28     return str(datetime.datetime.now())
29
30 bpy.types.Scene.test_date = bpy.props.StringProperty(get=get_date)
31
32
33 # Boolean array. Set function stores a single boolean value, returned as the second component.
34 # Array getters must return a list or tuple
35 # Array size must match the property vector size exactly
36 def get_array(self):
37     return (True, self["somebool"])
38
39
40 def set_array(self, values):
41     self["somebool"] = values[0] and values[1]
42
43 bpy.types.Scene.test_array = bpy.props.BoolVectorProperty(size=2, get=get_array, set=set_array)
44
45
46 # Enum property.
47 # Note: the getter/setter callback must use integer identifiers!
48 test_items = [
49     ("RED", "Red", "", 1),
50     ("GREEN", "Green", "", 2),
51     ("BLUE", "Blue", "", 3),
52     ("YELLOW", "Yellow", "", 4),
53     ]
54
55
56 def get_enum(self):
57     import random
58     return random.randint(1, 4)
59
60
61 def set_enum(self, value):
62     print("setting value", value)
63
64 bpy.types.Scene.test_enum = bpy.props.EnumProperty(items=test_items, get=get_enum, set=set_enum)
65
66
67 # Testing the properties:
68 scene = bpy.context.scene
69
70 scene.test_float = 12.34
71 print('test_float:', scene.test_float)
72
73 scene.test_array = (True, False)
74 print('test_array:', tuple(scene.test_array))
75
76 # scene.test_date = "blah"   # this would fail, property is read-only
77 print('test_date:', scene.test_date)
78
79 scene.test_enum = 'BLUE'
80 print('test_enum:', scene.test_enum)
81
82 # The above outputs:
83 # test_float: 12.34000015258789
84 # test_array: (True, False)
85 # test_date: 2018-03-14 11:36:53.158653
86 # setting value 3
87 # test_enum: GREEN