编辑代码

/**
 * LazyViewport - 懒加载视口内容
 * @param {Object} options 配置选项
 *   @param {string} options.selector 需要懒加载的元素选择器
 *   @param {number} options.threshold 提前加载的阈值(像素)
 *   @param {string} options.loadedClass 加载完成后添加的类名
 *   @param {function} options.onLoad 元素加载时的回调函数
 */
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()