Blender插件加载研究

目标

  • [x] 解析Blender插件代码加载原理, 为测试做准备

结论

采用方法3的方式, 可以在测试中保证重新加载子模块, 是想要的方式, 代码如下:

_qk_locals = locals()

def register():
    if "bpy" in _qk_locals:
        print(">>> plugin's submodules reload")
        from importlib import reload
        _modules_loaded[:] = [reload(val) for val in _modules_loaded]
        del reload
    from bpy.utils import register_class
    for mod in _modules_loaded:
        for cls in mod.classes:
            print('>>> register: ', cls.__name__)
            register_class(cls)

Blender插件加载分析

本分析基于Blender2.79b.

分析方法

  1. 在用户Blender插件目录下创建插件包
    我的测试插件为 C:\Users\yaoyu\AppData\Roaming\Blender Foundation\Blender\2.79\scripts\addons\qk_modeler
  2. __init__.py文件中插入输出代码, 查看效果
  3. 在Blender用户配置的"Add-ons"界面中, 勾选插件.

试验

1 init.py模块加载

if "bpy" in locals():
    print('reload...')
    from importlib import reload
    _modules_loaded[:] = [reload(val) for val in _modules_loaded]
    del reload
现象: 判断块内代码在反复勾选中, 没有触发
原因: "bpy" in locals() -> False

2 在1的基础上, 修改__init__.py文件代码

现象: 判断块内代码在第一次重勾选时触发
原因: "bpy" in locals() -> True

在__init__.py代码修改之后, 模块第一次重加载时会触发.

3 修改__init__.py模块之register()函数

_qk_locals = locals()

def register():
    if "bpy" in _qk_locals:
        print(">>> plugin's submodules reload")
        from importlib import reload
        _modules_loaded[:] = [reload(val) for val in _modules_loaded]
        del reload
    from bpy.utils import register_class
    for mod in _modules_loaded:
        for cls in mod.classes:
            print('>>> register: ', cls.__name__)
            register_class(cls)
现象: 判断块内代码在反复勾选中, 反复触发
原因: "bpy" in _qk_locals -> True

猜你喜欢

转载自www.cnblogs.com/yaoyu126/p/9343251.html