Blender中追加自定义节点组失败,代码调用无法导入该如何解决?
问题排查与解决方案
核心问题分析
你的代码直接通过bpy.data.node_groups['NPREEVEE']获取节点组失败,大概率是导入blend文件时未正确加载目标节点组,或是导入后节点组的名称/路径和预期不一致,和Blender本身Bug无关。
具体修正步骤
1. 确保节点组导入逻辑准确
你使用的import_from_library('shader')是自定义函数,若未明确指定加载node_groups类型资源,就会漏加载目标节点组。标准的Blender资源追加API应如下实现:
def import_from_library(self): # 替换为你的blend文件实际路径,支持相对路径// blend_path = "//your_shader_library.blend" with bpy.data.libraries.load(blend_path) as (data_from, data_to): # 精准加载指定名称的节点组 data_to.node_groups = [name for name in data_from.node_groups if name == 'NPREEVEE']
2. 导入后先做存在性检查
在获取节点组前添加检查,避免报错同时确认导入状态:
if 'NPREEVEE' not in bpy.data.node_groups: self.report({'ERROR'}, "节点组NPREEVEE未成功导入,请检查blend文件路径和资源名称") return {'CANCELLED'}
3. 创建节点组实例而非直接用原始数据
你之前的错误是直接调用节点组的原始数据,需要在当前材质的节点树中创建它的实例才能正常连接:
# 在材质节点树中创建节点组实例 shader_node = npr_material.node_tree.nodes.new(type='ShaderNodeGroup') shader_node.node_tree = bpy.data.node_groups['NPREEVEE']
4. 修正节点连接逻辑
用创建好的节点实例完成连接:
npr_material.node_tree.links.new(material_output.inputs[0], shader_node.outputs[0])
完整修正后的代码
class SHADER(Operator): bl_idname = "material.append_shader_nodes" bl_label = "Add Shader" bl_options = {'REGISTER', 'UNDO'} def import_from_library(self): # 替换为你的blend文件实际路径 blend_file_path = "//shader_library.blend" with bpy.data.libraries.load(blend_file_path) as (data_from, data_to): data_to.node_groups = [name for name in data_from.node_groups if name == 'NPREEVEE'] def execute(self, context): # 导入节点组 self.import_from_library() # 检查节点组是否导入成功 if 'NPREEVEE' not in bpy.data.node_groups: self.report({'ERROR'}, "无法找到节点组NPREEVEE,请确认blend文件路径和节点组名称") return {'CANCELLED'} bpy.ops.object.material_slot_add() # 创建新材质 npr_material = bpy.data.materials.new(name='SHADER') npr_material.use_nodes = True # 删除默认节点 if 'Principled BSDF' in npr_material.node_tree.nodes: npr_material.node_tree.nodes.remove(npr_material.node_tree.nodes['Principled BSDF']) material_output = npr_material.node_tree.nodes.get('Material Output') if not material_output: self.report({'ERROR'}, "材质输出节点不存在") return {'CANCELLED'} # 创建节点组实例并设置位置 shader_node = npr_material.node_tree.nodes.new(type='ShaderNodeGroup') shader_node.node_tree = bpy.data.node_groups['NPREEVEE'] shader_node.location = (-300, 0) # 连接节点 npr_material.node_tree.links.new(material_output.inputs[0], shader_node.outputs[0]) # 设置为当前材质 context.object.active_material = npr_material return {'FINISHED'}
额外注意事项
- 确认源blend文件中,节点组名称确实为
NPREEVEE(Blender资源名称区分大小写) - 若通过资产浏览器管理资源,需使用资产导入API而非普通
library.load - 手动能导入说明资源本身无问题,问题必然出在代码的导入逻辑或节点实例化步骤
内容的提问来源于stack exchange,提问作者KNTY
相关产品推荐
相关产品推荐

