目录
本节课程带你了解,如何添加插件的偏好设置。
01 代码框架
修改 __init__.py
代码,除 bl_info 参数不变,其余的更新为以下代码:
import bpy
from bpy.props import StringProperty, IntProperty, BoolProperty
from bpy.types import Operator, AddonPreferences
class aleshu_addon_prefs_panel(AddonPreferences):
bl_idname = __name__
filepath: StringProperty(
name="文件路径",
subtype='FILE_PATH',
)
number: IntProperty(
name="数字",
default=4,
)
boolean: BoolProperty(
name="布尔",
default=False,
)
def draw(self, context):
layout = self.layout
box = layout.box()
box.label(text="插件偏好设置:")
row = box.row()
row.prop(self, 'boolean')
row = box.row()
row.prop(self, 'filepath')
row = box.row()
row.prop(self, 'number')
row.operator(test_button.bl_idname, text="调试输出")
class test_button(Operator):
bl_idname = "aleshu.test_button"
bl_label = "测试按钮"
bl_description = "测试按钮-描述"
@classmethod
def poll(cls, context):
return (context.object is not None)
def invoke(self, context, event):
preferences = context.preferences
addon_prefs = preferences.addons[__name__].preferences
info = ("文件路径: %s, 数字: %d, 布尔值: %r" %
(addon_prefs.filepath, addon_prefs.number, addon_prefs.boolean))
print(info)
return {"FINISHED"}
classes = (
aleshu_addon_prefs_panel,
test_button
)
def register():
for cls in classes:
bpy.utils.register_class(cls)
def unregister():
for cls in classes:
bpy.utils.unregister_class(cls)
if __name__ == "__main__":
register()
想要在偏好设置的插件列表中加入插件自己的偏好设置,你必须要按照以下步骤操作:
-
注册一个AddonPreferences类(bpy.types.AddonPreferences);
-
注册一个Operator类(bpy.types.Operator)。
02 定义一个AddonPreferences类
根据以上步骤,我们需要先定义一个 AddonPreferences 类。
from bpy.props import StringProperty, IntProperty, BoolProperty
from bpy.types import Operator, AddonPreferences
class aleshu_addon_prefs_panel(AddonPreferences):
bl_idname = __name__
filepath: StringProperty(
name="文件路径",
subtype='FILE_PATH',
)
def draw(self, context):
layout = self.layout
box = layout.box()
box.label(text="插件偏好设置:")
row = box.row()
row.prop(self, 'filepath')
其中 bl_idname
必须为 __name__
或者插件的名称,否则该设置无法定位至对应插件的偏好设置的位置。
StringProperty 表示该组件接收的结果为字符串,在Blender中,共有以下9种类型:
02.01 BoolProperty
bpy.props.BoolProperty(name='', description='', translation_context='*', default=False, options={'ANIMATABLE'}, override=set(), tags=set(), subtype='NONE', update=None, get=None, set=None)
02.02 BoolVectorProperty
bpy.props.BoolVectorProperty(name='', description='', translation_context='*', default=(False, False, False), options={'ANIMATABLE'}, override=set(), tags=set(), subtype='NONE', size=3, update=None, get=None, set=None)
02.03 CollectionProperty
bpy.props.CollectionProperty(type=None, name='', description='', translation_context='*', options={'ANIMATABLE'}, override=set(), tags=set())
02.04 EnumProperty
bpy.props.EnumProperty(items, name='', description='', translation_context='*', default=None, options={'ANIMATABLE'}, override=set(), tags=set(), update=None, get=None, set=None)
02.05 FloatProperty
bpy.props.FloatProperty(name='', description='', translation_context='*', default=0.0, min=-3.402823e+38, max=3.402823e+38, soft_min=-3.402823e+38, soft_max=3.402823e+38, step=3, precision=2, options={'ANIMATABLE'}, override=set(), tags=set(), subtype='NONE', unit='NONE', update=None, get=None, set=None)
02.06 FloatVectorProperty
bpy.props.FloatVectorProperty(name='', description='', translation_context='*', default=(0.0, 0.0, 0.0), min=sys.float_info.min, max=sys.float_info.max, soft_min=sys.float_info.min, soft_max=sys.float_info.max, step=3, precision=2, options={'ANIMATABLE'}, override=set(), tags=set(), subtype='NONE', unit='NONE', size=3, update=None, get=None, set=None)
02.07 IntProperty
bpy.props.IntProperty(name='', description='', translation_context='*', default=0, min=-2**31, max=2**31 - 1, soft_min=-2**31, soft_max=2**31 - 1, step=1, options={'ANIMATABLE'}, override=set(), tags=set(), subtype='NONE', update=None, get=None, set=None)
02.08 IntVectorProperty
bpy.props.IntVectorProperty(name='', description='', translation_context='*', default=(0, 0, 0), min=-2**31, max=2**31 - 1, soft_min=-2**31, soft_max=2**31 - 1, step=1, options={'ANIMATABLE'}, override=set(), tags=set(), subtype='NONE', size=3, update=None, get=None, set=None)
02.09 PointerProperty
bpy.props.PointerProperty(type=None, name='', description='', translation_context='*', options={'ANIMATABLE'}, override=set(), tags=set(), poll=None, update=None)
02.10 移除动态定义的属性
bpy.props.RemoveProperty(cls, attr)
02.11 参数解释
-
description:工具的提示
-
name:组件名称
-
identifier:唯一组件名称
-
subtype:组件类型,可选参数:查看 组件类型
-
default:默认值
-
min:最小值
-
max:最大值
row.prop(self, 'boolean', icon='QUESTION')
row.operator(test_button.bl_idname, text="调试输出", icon='QUESTION')
当我们需要在组件上添加图标时,可以使用上面的icon属性,icon图标列表点此查看。
03 定义一个Operator类
class test_button(Operator):
bl_idname = "aleshu.test_button"
bl_label = "测试按钮"
bl_description = "测试按钮-描述"
@classmethod
def poll(cls, context):
return (context.object is not None)
def invoke(self, context, event):
preferences = context.preferences
addon_prefs = preferences.addons[__name__].preferences
info = ("文件路径: %s, 数字: %d, 布尔值: %r" %
(addon_prefs.filepath, addon_prefs.number, addon_prefs.boolean))
print(info)
return {"FINISHED"}
poll() 函数的返回值决定按钮是否可用,invoke() 函数会在按钮按下后执行算法逻辑。
在本段算法逻辑中,将会获取自定义参数的值,并将其输出至命令行窗口。
注意:必须定义至少一个 Operator 类,如果没有任何按钮,可以使用以下代码来代替。
class OBJECT_OT_addon_prefs(Operator):
bl_idname = "object.addon_prefs"
bl_label = "Add-on Preferences"
def execute(self, context):
return {'FINISHED'}
04 注册类名
classes = (
aleshu_addon_prefs_panel,
test_button
)
def register():
for cls in classes:
bpy.utils.register_class(cls)
def unregister():
for cls in classes:
bpy.utils.unregister_class(cls)
注册类名的老套路了,这里就不作解释了。
05 效果展示
注意:即使Blender重启,偏好设置中的值也会保存,但是重开插件,会丢失偏好设置的值。
如果你想要免费的blender插件、模型等可以看看这个blender资源库
还有免费的Blender入门教程