Hello bf-python! This is my first time posting on this list. I working on a plugin for Blender for some time now and I'm having some issues when using the EnumProperty object. My objective is to provide a drop-down menu for the user where he/she can select a given device from a list. I then want to retrieve the currently selected device and perform some initialization.
Well I managed to create the menu and populated it with my device list - which are strings, basically. But when the user select the device he wants, I can only access the string that is currently selected, and not the unique identifier of the string (such as an index). This can cause bugs on my plugin since I can have two devices with the same name. One of my attempted solutions is using the "set" callback from the EnumProperties, that I can capture the "value" argument and use as an index. But there's one problem, as soon as I set a "set" callback function, the menu itself stop updating with the selected device, even though I receive the right value on my callback. Here's a sample cls.device = EnumProperty( name="Device", description="Device to use for rendering", items=my_devices, set=set_my_device, ) def set_my_device(self, value): print("Device index is {0}".format(value)) return None I do receive the "Device index is X" with the right index, but the user interface does not change. I'm following the tutorial available on Property documentation [1], my guess is that I'm suppose to do something within the callback to get the right option to appear selected on Blender, but I don't know what it is. Attached there's a minimal sample that you can copy and paste into blender to reproduce the problem. Button appears on the Render panel, below the render button. I'm testing in 2.76b. I stuck into this problem for some time and would really appreciate any help, or maybe some other solution to get the index from EnumProperty. Henrique Jung [1] https://www.blender.org/api/blender_python_api_current/bpy.props.html#get-set-example
from bl_ui import properties_render import bpy from bpy.props import (BoolProperty, EnumProperty, FloatProperty, IntProperty, PointerProperty) def my_devices(scene, context): devices = [("Device 1", "Device 1","", 1), ("Device 2", "Device 2","", 2), ] return devices def set_my_device(self, value): print("Device index is {0}".format(value)) return None class MySettings(bpy.types.PropertyGroup): @classmethod def register(cls): bpy.types.Scene.my_settings = PointerProperty( name = "My settings", description = "My settings properties", type=MySettings) cls.device = EnumProperty( name="Device", description="Device to use for rendering", items=my_devices, set=set_my_device, ) def set_my_device(self,value): print("Index is now {0}".format(value)) return None @classmethod def unregister(cls): del bpy.types.Scene.my_settings def my_options(self, context): self.layout.prop(context.scene.my_settings,"device") def register(): bpy.utils.register_class(MySettings) properties_render.RENDER_PT_render.append(my_options) if __name__ == "__main__": register()
_______________________________________________ Bf-python mailing list Bf-python@blender.org https://lists.blender.org/mailman/listinfo/bf-python