目标

  • [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

Blender插件加载研究的更多相关文章

  1. 基于.NET MVC的高性能IOC插件化架构(二)之插件加载原理

    上一篇博文简单介绍了下插件化的代码组成部分:http://www.cnblogs.com/gengzhe/p/4390932.html,源码地址:https://github.com/luohuazh ...

  2. Qt中如何 编写插件 加载插件 卸载插件

    Qt中如何 编写插件 加载插件 卸载插件是本文要介绍的内容.Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoade ...

  3. 纸壳CMS的插件加载机制

    纸壳CMS是一个开源的可视化设计CMS,通过拖拽,在线编辑的方式来创建网站. GitHub https://github.com/SeriaWei/ZKEACMS.Core 欢迎Star,Fork,发 ...

  4. Bootstrap 按钮(Button)插件加载状态

    通过按钮(Button)插件,您可以添加进一些交互.比如控制按钮的状态.或者为其它组件(工具栏)创建按钮组. 加载状态 如需向按钮添加加载状态,只需要简单地向 button 元素添加 data-loa ...

  5. phonegap插件加载与使用

    有朋友问能不能在CanTK和AppBuilder开发的APP里发送UDP数据,HTML5里只能用HTTPS/HTTP/WebSocket几种通讯方式,要使用UDP需要通过phonegap打包成APK等 ...

  6. Unity5.x版本AssetBundle加载研究

    之前说了 “Unity5.x版本AssetBundle打包研究”,没看过的请先看一下:http://www.shihuanjue.com/?p=57 再来看本文,有一定的连接性. 先梳理一下思路: 要 ...

  7. Eclipse 插件安装方法和插件加载失败解决办法

    一:是利用Eclipse Software  Update 添加网址,让Eclipse 自动的搜索下载最新的插件. 比如安装VE这个可视化编辑UI的插件,其步骤为 Help > Software ...

  8. Chrome无界面浏览模式与自定义插件加载问题

    环境:Python 3.5.x + Selenium 3.4.3 + Chromedriver 2.30 + Chrome 60 beta或Chromium Canary 61 + WIN10 Chr ...

  9. (原创)[C#] MEF 主程序与插件加载不同版本的DLL

    一.前言 MEF(Managed Extensibility Framework),是轻量级的插件框架.使用简单,功能强大.详细介绍见MSDN,本文不再赘述. 在使用MEF时,会遇到这样一种场景: 主 ...

随机推荐

  1. 用u盘安装黑苹果10.12.3

    链接: https://pan.baidu.com/s/1eR9GgwE 密码: rubh 主机和显示器必须是数字口连接,如dvi.displayport,VGA不能进安装界面 下载苹果镜像文件10. ...

  2. css知识框架

  3. 原生Ajax的使用——含开放API接口

    看了两天关于Ajax的使用,总感觉云里雾里的. 故在此总结梳理一下,如果疏漏错误还请纠正支出. Ajax能够在向服务器请求额外的数据时,不必重新加载/卸载整个页面,实现一小块区域性的刷新,也是常说的异 ...

  4. maven常用dos命令

    在平常的开发中可能会经常切换开发中的一些工具,有时就会对一些常用的命令给忘记了 这里特别记录下来方便以后使用: 1.查看maven版本:mvn -c 2.一件构建启动Tomcat:mvn tomcat ...

  5. S-HR之OSF

    1):getWorkDayCount ->ArrayList data = (ArrayList) com.kingdee.shr.rpts.ctrlreport.osf.OSFExecutor ...

  6. C语言中的DEBUG

    #cat aa.c #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include < ...

  7. js 阻止冒泡事件和默认事件

    阻止事件冒泡 window.enent ? window.enent.cancelBubble = true : e.stopPropagation() function stopBubble(eve ...

  8. 爬虫文件存储-2:MongoDB

    1.连接MongoDB 连接 MongoDB 我们需要使用 PyMongo 库里面的 MongoClient,一般来说传入 MongoDB 的 IP 及端口即可,第一个参数为地址 host,第二个参数 ...

  9. javascript 闭包笔记

      先来解释一下闭包: 1.闭包就是函数嵌套函数 2.内部函数可以引用外部函数的参数和变量 3.参数和变量不会被垃圾回收机制所收回( 垃圾回收机制就是用完变量之后就在内存中释放 ) 使用闭包的好处: ...

  10. 【Codeforces 474D】Flowers

    [链接] 我是链接,点我呀:) [题意] 让你吃东西 B食物一次必须要吃连续k个 但是对A食物没有要求 问你有多少种吃n个食物的方法(吃的序列) [题解] 设f[i]表示长度为i的吃的序列且符合要求的 ...