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.
分析方法
- 在用户Blender插件目录下创建插件包
我的测试插件为C:\Users\yaoyu\AppData\Roaming\Blender Foundation\Blender\2.79\scripts\addons\qk_modeler - 在
__init__.py文件中插入输出代码, 查看效果 - 在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插件加载研究的更多相关文章
- 基于.NET MVC的高性能IOC插件化架构(二)之插件加载原理
上一篇博文简单介绍了下插件化的代码组成部分:http://www.cnblogs.com/gengzhe/p/4390932.html,源码地址:https://github.com/luohuazh ...
- Qt中如何 编写插件 加载插件 卸载插件
Qt中如何 编写插件 加载插件 卸载插件是本文要介绍的内容.Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoade ...
- 纸壳CMS的插件加载机制
纸壳CMS是一个开源的可视化设计CMS,通过拖拽,在线编辑的方式来创建网站. GitHub https://github.com/SeriaWei/ZKEACMS.Core 欢迎Star,Fork,发 ...
- Bootstrap 按钮(Button)插件加载状态
通过按钮(Button)插件,您可以添加进一些交互.比如控制按钮的状态.或者为其它组件(工具栏)创建按钮组. 加载状态 如需向按钮添加加载状态,只需要简单地向 button 元素添加 data-loa ...
- phonegap插件加载与使用
有朋友问能不能在CanTK和AppBuilder开发的APP里发送UDP数据,HTML5里只能用HTTPS/HTTP/WebSocket几种通讯方式,要使用UDP需要通过phonegap打包成APK等 ...
- Unity5.x版本AssetBundle加载研究
之前说了 “Unity5.x版本AssetBundle打包研究”,没看过的请先看一下:http://www.shihuanjue.com/?p=57 再来看本文,有一定的连接性. 先梳理一下思路: 要 ...
- Eclipse 插件安装方法和插件加载失败解决办法
一:是利用Eclipse Software Update 添加网址,让Eclipse 自动的搜索下载最新的插件. 比如安装VE这个可视化编辑UI的插件,其步骤为 Help > Software ...
- Chrome无界面浏览模式与自定义插件加载问题
环境:Python 3.5.x + Selenium 3.4.3 + Chromedriver 2.30 + Chrome 60 beta或Chromium Canary 61 + WIN10 Chr ...
- (原创)[C#] MEF 主程序与插件加载不同版本的DLL
一.前言 MEF(Managed Extensibility Framework),是轻量级的插件框架.使用简单,功能强大.详细介绍见MSDN,本文不再赘述. 在使用MEF时,会遇到这样一种场景: 主 ...
随机推荐
- Map 键值对 set get delete
- CAD在网页中得到批注信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- Silverlight之我见——DataGrid数据验证
<UserControl x:Class="DataValidationSample.MainPage" xmlns="http://schemas.microso ...
- hdu 3500 DFS(限定)
Fling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submi ...
- CodeForcesGym 100735G LCS Revised
LCS Revised Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on CodeForcesGym. O ...
- noip模拟赛 radius
分析:这道题实在是不好想,一个可以骗分的想法是假定要求的那个点在中心点上,可以骗得不少分.但是在边上的点要怎么确定呢?理论复杂度O(﹢无穷).答案一定是和端点有关的,涉及到最大值最小,考虑二分最大值, ...
- noip模拟赛 Massacre at Béziers
题目背景 下发压缩包链接: https://pan.baidu.com/s/1geC4ooz 密码: 3vpt 所有的一切———所有的一切都被染成了红与黑. 翻卷的红莲烈焰舔舐着大地,释放出异抽的黑烟 ...
- hdu_1061_Rightmost Digit_201311071851
Rightmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- [luogu1373]小a和uim之大逃离_动态规划
小a和uim之大逃离 题目大意:有一个n*m的矩阵.每个格子上有一坨0~k不等量的权值.有两个人,每个人任选一个格子作为出发点,并只能向下或向右走.求最后两个人所得到的权值mod k相等的方案数. 注 ...
- Java多线程之如何确定线程数
关于多线程的线程数的确定,最近研读过几篇paper,在此做一下笔记,方便使用时翻看. 1.<Java 虚拟机并发编程>中介绍 就是说:线程数 = CPU的核心数 * (1 - 阻塞系数) ...