You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:55:42