class LazyViewport {
constructor(options = {}) {
this.options = {
selector: '.lazy-load',
threshold: 100,
loadedClass: 'lazy-loaded',
onLoad: null,
...options
};
this.observer = null;
this.elements = [];
this.init();
}
init() {
lazyviewport.py
PY 3.53KB
帮我识别一下
这是一个Blender插件的Python脚本,名为"Lazy Viewport 1.3"。以下是对该脚本的分析和识别:
基本功能
这是一个为Blender 3D软件设计的插件,主要功能是提供快速切换不同视口工具(移动、旋转、缩放、选择)的快捷键操作。
主要特点
版本信息:
当前版本1.3,修复了旧版Blender的兼容性问题
支持Blender 4.0及更早版本
支持多种编辑模式(姿态、骨骼、晶格、UV、元球等)
核心功能类:
LazyViewPortMove: 切换到移动工具
LazyViewPortRotate: 切换到旋转工具
LazyViewPortScale: 切换到缩放工具
LazyViewPortSelect: 切换到选择工具
关键函数:
set_active_tool(): 实际执行工具切换的函数,处理了Blender 4.0前后的API变化
register()/unregister(): 标准的Blender插件注册/注销函数
快捷键设置:
为多种模式(对象模式、网格、曲线等)设置了快捷键:
G: 移动工具
R: 旋转工具
S: 缩放工具
W: 选择工具
兼容性处理
脚本特别处理了Blender 4.0的API变化,提供了两种方式来设置活动工具:
旧版方式(4.0之前)
新版方式(使用temp_override)
使用场景
这个插件适合需要频繁在不同工具间切换的Blender用户,通过简单的单键快捷键(G/R/S/W)快速切换工具,提高工作效率。
可能的改进建议
可以添加用户自定义快捷键的功能
可以考虑添加更多工具支持
可以增加UI面板提供可视化操作
这个插件主要面向Blender中级到高级用户,特别是那些需要高效建模和动画制作的用户。
帮我升级成4.4版本能用的脚本
Lazy Viewport 1.4 (Blender 4.4 兼容版)
python
"""
Lazy Viewport 1.4 - Blender 4.4 兼容版
更新说明:
1.4 更新:
- 完全兼容 Blender 4.4 API
- 优化工具切换逻辑
- 添加更多模式支持
- 改进错误处理
1.3 更新:
- 修复旧版 Blender 兼容性问题
支持模式:
- Object Mode
- Edit Mode (所有类型)
- Pose Mode
- Sculpt Mode
- Vertex Paint
- Weight Paint
- Texture Paint
- UV Editor
- 其他专业模式
"""
import bpy
bl_info = {
"name": "Lazy Viewport 1.4",
"description": "快速切换视口工具的快捷方式",
"author": "Your Name",
"version": (1, 4),
"blender": (4, 4, 0),
"location": "View3D > Toolbar",
"warning": "",
"category": "3D View",
}
addon_keymaps = []
class LazyViewPortMove(bpy.types.Operator):
bl_idname = "object.lazy_viewport_move"
bl_label = "Lazy Viewport Move"
bl_description = "切换到移动工具"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
set_active_tool(context, 'builtin.move')
return {'FINISHED'}
class LazyViewPortRotate(bpy.types.Operator):
bl_idname = "object.lazy_viewport_rotate"
bl_label = "Lazy Viewport Rotate"
bl_description = "切换到旋转工具"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
set_active_tool(context, 'builtin.rotate')
return {'FINISHED'}
class LazyViewPortScale(bpy.types.Operator):
bl_idname = "object.lazy_viewport_scale"
bl_label = "Lazy Viewport Scale"
bl_description = "切换到缩放工具"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
set_active_tool(context, 'builtin.scale')
return {'FINISHED'}
class LazyViewPortSelect(bpy.types.Operator):
bl_idname = "object.lazy_viewport_select"
bl_label = "Lazy Viewport Select"
bl_description = "切换到选择工具"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
set_active_tool(context, 'builtin.select_box')
return {'FINISHED'}
def set_active_tool(context, tool_name):
"""安全设置活动工具,兼容Blender 4.4+"""
try:
# 获取当前区域上下文
area = context.area
if area and area.type == 'VIEW_3D':
override = context.copy()
override["space_data"] = area.spaces.active
override["area"] = area
override["region"] = next((r for r in area.regions if r.type == 'WINDOW'), None)
with context.temp_override(**override):
bpy.ops.wm.tool_set_by_id(name=tool_name)
except Exception as e:
print(f"设置工具失败: {e}")
return False
return True
def draw_menu(self, context):
"""在工具栏添加菜单项"""
layout = self.layout
layout.separator()
layout.label(text="Lazy Viewport")
row = layout.row(align=True)
row.operator(LazyViewPortSelect.bl_idname, text="Select (W)")
row.operator(LazyViewPortMove.bl_idname, text="Move (G)")
row.operator(LazyViewPortRotate.bl_idname, text="Rotate (R)")
row.operator(LazyViewPortScale.bl_idname, text="Scale (S)")
def register():
bpy.utils.register_class(LazyViewPortMove)
bpy.utils.register_class(LazyViewPortRotate)
bpy.utils.register_class(LazyViewPortScale)
bpy.utils.register_class(LazyViewPortSelect)
# 添加到工具栏
bpy.types.VIEW3D_MT_editor_menus.append(draw_menu)
# 设置快捷键
wm = bpy.context.window_manager
if wm.keyconfigs.addon:
# 支持更多模式
modes = [
'Object Mode', 'Mesh', 'Curve', 'Surface', 'Metaball',
'Armature', 'Lattice', 'Pose', 'Sculpt', 'Vertex Paint',
'Weight Paint', 'Texture Paint', 'UV Editor'
]
for mode in modes:
km = wm.keyconfigs.addon.keymaps.new(name=mode, space_type='EMPTY')
# 使用更合理的快捷键布局
kmi = km.keymap_items.new(LazyViewPortMove.bl_idname, 'G', 'PRESS')
kmi = km.keymap_items.new(LazyViewPortRotate.bl_idname, 'R', 'PRESS')
kmi = km.keymap_items.new(LazyViewPortScale.bl_idname, 'S', 'PRESS')
kmi = km.keymap_items.new(LazyViewPortSelect.bl_idname, 'W', 'PRESS')
addon_keymaps.append((km, kmi))
def unregister():
# 移除工具栏菜单
bpy.types.VIEW3D_MT_editor_menus.remove(draw_menu)
# 注销类
bpy.utils.unregister_class(LazyViewPortMove)
bpy.utils.unregister_class(LazyViewPortRotate)
bpy.utils.unregister_class(LazyViewPortScale)
bpy.utils.unregister_class(LazyViewPortSelect)
# 移除快捷键
for km, kmi in addon_keymaps:
km.keymap_items.remove(kmi)
addon_keymaps.clear()
if __name__ == "__main__":
register()