多物体添加、修改、删除修改器同步
我只在4.2测试过,其他版本理论上应该也可以

通过网盘分享的文件:tongbuxiugaiqi.py
直接在软件里面选择py格式安装
源码
import bpy# 记录上一次修改器状态last_modifier_states = {}# 记录上一次选中的对象last_selected_objects = []bl_info = { "name": "同步修改器", "author": "老黄", "version": (1, 0), "blender": (4, 2, 0), "location": "Properties > Modifiers", "description": "同步选中的多个物体修改器的添加,修改,删除操作。", "category": "Object",}def get_modifier_state(modifier): """ 获取修改器的状态,以元组形式返回可写属性的值 """ state = [] for prop in modifier.rna_type.properties: if not prop.is_readonly: state.append(getattr(modifier, prop.identifier)) return tuple(state)def sync_modifier_changes(scene): global last_active_modifier_states, last_selected_objects context = bpy.context selected_objects = context.selected_objects active_object = context.active_object # 如果选中对象没有变化且活动对象没有变化,直接返回 if selected_objects == last_selected_objects and active_object: current_active_states = {} for modifier in active_object.modifiers: modifier_key = (active_object.name, modifier.name) current_active_states[modifier_key] = get_modifier_state(modifier) # 检查是否有修改器添加 for key in set(current_active_states) - set(last_active_modifier_states): sync_add_modifier(active_object, selected_objects, key) # 检查是否有修改器属性变化或删除 for key in set(last_active_modifier_states): if key in current_active_states: if current_active_states[key] != last_active_modifier_states[key]: sync_modify_modifier(active_object, selected_objects, key) else: sync_delete_modifier(active_object, selected_objects, key) last_active_modifier_states = current_active_states else: # 更新选中对象和活动对象状态 last_selected_objects = selected_objects if active_object: last_active_modifier_states = {} for modifier in active_object.modifiers: modifier_key = (active_object.name, modifier.name) last_active_modifier_states[modifier_key] = get_modifier_state(modifier)def sync_add_modifier(active_object, selected_objects, modifier_key): """ 同步添加修改器到其他选中对象 """ modifier_name = modifier_key[1] modifier = next((m for m in active_object.modifiers if m.name == modifier_name), None) if modifier: modifier_type = modifier.type for obj in selected_objects: if obj != active_object and obj.type == 'MESH': existing_mod = next((mod for mod in obj.modifiers if mod.type == modifier_type and mod.name == modifier_name), None) if existing_mod is None: new_mod = obj.modifiers.new(name=modifier_name, type=modifier_type) else: new_mod = existing_mod for prop in modifier.rna_type.properties: if not prop.is_readonly: setattr(new_mod, prop.identifier, getattr(modifier, prop.identifier))def sync_modify_modifier(active_object, selected_objects, modifier_key): """ 同步修改修改器属性到其他选中对象 """ modifier_name = modifier_key[1] modifier = next((m for m in active_object.modifiers if m.name == modifier_name), None) if modifier: modifier_type = modifier.type for obj in selected_objects: if obj != active_object and obj.type == 'MESH': for mod in obj.modifiers: if mod.type == modifier_type and mod.name == modifier_name: for prop in modifier.rna_type.properties: if not prop.is_readonly: setattr(mod, prop.identifier, getattr(modifier, prop.identifier))def sync_delete_modifier(active_object, selected_objects, modifier_key): """ 同步删除修改器到其他选中对象 """ modifier_name = modifier_key[1] for obj in selected_objects: if obj != active_object and obj.type == 'MESH': for mod in obj.modifiers[:]: if mod.name == modifier_name: obj.modifiers.remove(mod)def register(): bpy.app.handlers.depsgraph_update_post.append(sync_modifier_changes)def unregister(): bpy.app.handlers.depsgraph_update_post.remove(sync_modifier_changes)if __name__ == "__main__": register()


请先 !