Blender插件开发-插件的偏好设置

目录

01 代码框架

02 定义一个AddonPreferences类

02.01 BoolProperty

02.02 BoolVectorProperty

02.03 CollectionProperty

02.04 EnumProperty

02.05 FloatProperty

02.06 FloatVectorProperty

02.07 IntProperty

02.08 IntVectorProperty

02.09 PointerProperty

02.10 移除动态定义的属性

02.11 参数解释

03 定义一个Operator类

04 注册类名

05 效果展示


本节课程带你了解,如何添加插件的偏好设置。

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
  1. 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
  1. 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
  1. bpy.props.CollectionProperty(type=None, name='', description='', translation_context='*', options={'ANIMATABLE'}, override=set(), tags=set())
02.04 EnumProperty
  1. 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
  1. 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
  1. 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
  1. 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
  1. 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
  1. bpy.props.PointerProperty(type=None, name='', description='', translation_context='*', options={'ANIMATABLE'}, override=set(), tags=set(), poll=None, update=None)
02.10 移除动态定义的属性
  1. bpy.props.RemoveProperty(cls, attr)
02.11 参数解释
  • description:工具的提示

  • name:组件名称

  • identifier:唯一组件名称

  • subtype:组件类型,可选参数:查看 组件类型

  • default:默认值

  • min:最小值

  • max:最大值

 
  1. row.prop(self, 'boolean', icon='QUESTION')
  2. 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 类,如果没有任何按钮,可以使用以下代码来代替。

  1. class OBJECT_OT_addon_prefs(Operator):
  2. bl_idname = "object.addon_prefs"
  3. bl_label = "Add-on Preferences"
  4. def execute(self, context):
  5. return {'FINISHED'}

04 注册类名

  1. classes = (
  2. aleshu_addon_prefs_panel,
  3. test_button
  4. )
  5. def register():
  6. for cls in classes:
  7. bpy.utils.register_class(cls)
  8. def unregister():
  9. for cls in classes:
  10. bpy.utils.unregister_class(cls)

注册类名的老套路了,这里就不作解释了。

05 效果展示

注意:即使Blender重启,偏好设置中的值也会保存,但是重开插件,会丢失偏好设置的值。

如果你想要免费的blender插件、模型等可以看看这个blender资源库

还有免费的Blender入门教程

【频道】Blender插件开发 - 乐述云享

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

one行feng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值