0
$\begingroup$

I have written a code to create a NodeGroup using python inside Blender. NodeGroup and GroupInput and GroupOutput nodes inside NodeGroup are also created successfully. The GroupInput node works fine for creating sockets while the other GroupOutput node throws an error.

enter image description here

import bpy

def back_facing_node_group(name):
    #Create NodeGroup
    back_facing = bpy.data.node_groups.new(name,'ShaderNodeTree')
    #Group input node and its sockets
    group_inp = back_facing.nodes.new('NodeGroupInput')
    group_inp.outputs.new('NodeSocketColor','Color')
    #Group output node and its sockets
    group_out = back_facing.nodes.new('NodeGroupOutput')
    group_out.inputs.new('NodeSocketColor','Color')
    #Group Nodes
    geo_node = back_facing.nodes.new('ShaderNodeNewGeometry')
    mix_node = back_facing.nodes.new('ShaderNodeMixRGB')
    #Group Links
    back_facing.links.new(group_inp.outputs['Color'],mix_node.inputs[1])
    back_facing.links.new(geo_node.outputs[6], mix_node.inputs[0])
    back_facing.links.new(mix_node.outputs[0], group_out.inputs['Color'])
    return back_facing

group = bpy.context.object.active_material.node_tree.nodes.new('ShaderNodeGroup')
group.location = -300,200
group.node_tree = back_facing_node_group('Node_group')
$\endgroup$

3 Answers 3

1
$\begingroup$

If this is the expected output then use the following script, you have to replace group_inp.outputs.new with back_facing.outputs.new

enter image description here

import bpy

def back_facing_node_group(name):
    #Create NodeGroup
    back_facing = bpy.data.node_groups.new(name,'ShaderNodeTree')
    #Group input node and its sockets
    group_inp = back_facing.nodes.new('NodeGroupInput')
    back_facing.outputs.new('NodeSocketColor','Color')
    
    #Group output node and its sockets
    group_out = back_facing.nodes.new('NodeGroupOutput')
    back_facing.inputs.new('NodeSocketColor','Color')

    #Group Nodes
    geo_node = back_facing.nodes.new('ShaderNodeNewGeometry')
    mix_node = back_facing.nodes.new('ShaderNodeMixRGB')
    
    #Group Links
    back_facing.links.new(group_inp.outputs['Color'],mix_node.inputs[1])
    back_facing.links.new(geo_node.outputs[6], mix_node.inputs[0])
    back_facing.links.new(mix_node.outputs[0], group_out.inputs['Color'])
    return back_facing

group = bpy.context.object.active_material.node_tree.nodes.new('ShaderNodeGroup')
group.location = -300,200
group.node_tree = back_facing_node_group('Node_group')
$\endgroup$
1
  • 1
    $\begingroup$ Thank you very much. $\endgroup$ Commented Jan 25, 2023 at 13:36
3
$\begingroup$

In Blender 4.0 the "inputs" and "outputs" were removed from "bpy.types.NodeTree" (https://docs.blender.org/api/current/change_log.html#bpy-types-nodetree)

Thus adding and changing Node Group Inputs/Outputs is different now. Here is an Example for adding a Shader Node

    #Add the Node Group
    someGroup = bpy.data.node_groups.new('someGroup', 'ShaderNodeTree')

    #Add the Input Sockets and change their Default Values
    someGroup.interface.new_socket(name="Some Color Input",description="some_color_input",in_out ="INPUT", socket_type="NodeSocketColor")
    someGroup.interface.items_tree[0].default_value = [1.0,1.0,1.0,1.0]
    someGroup.interface.new_socket(name="Some Float Input",description="some_float_input",in_out ="INPUT", socket_type="NodeSocketFloat")
    someGroup.interface.items_tree[1].default_value = 1.0

    #Add the Output Sockets and change their Default Value
    someGroup.interface.new_socket(name="Some Shader Output",description="some_shader_output",in_out ="OUTPUT", socket_type="NodeSocketShader")

    #Add Group Input/Output Nodes and position them
    group_input : bpy.types.ShaderNodeGroup = IndirectLightingGroup.nodes.new('NodeGroupInput')
    group_input.location = (-340,80)
    group_output : bpy.types.ShaderNodeGroup = IndirectLightingGroup.nodes.new('NodeGroupOutput')
    group_output.location = (180,300)
$\endgroup$
1
$\begingroup$
import bpy

def back_facing_node_group(name):
    #Create NodeGroup
    back_facing = bpy.data.node_groups.new(name,'ShaderNodeTree')
    #Group input node and its sockets
    group_inp = back_facing.nodes.new('NodeGroupInput')
    group_inp.outputs.new('NodeSocketColor','Color')
    #Group output node and its sockets
    group_out = back_facing.nodes.new('NodeGroupOutput')
    #Group Nodes
    geo_node = back_facing.nodes.new('ShaderNodeNewGeometry')
    mix_node = back_facing.nodes.new('ShaderNodeMixRGB')
    #Group Links
    back_facing.links.new(geo_node.outputs['Backfacing'], mix_node.inputs['Fac'])
    back_facing.links.new(group_inp.outputs['Color'], mix_node.inputs['Color1'])
    back_facing.links.new(mix_node.outputs['Color'], group_out.inputs[''])
    return back_facing

group = bpy.context.object.active_material.node_tree.nodes.new('ShaderNodeGroup')
group.location = -300,200
group.node_tree = back_facing_node_group('Node_group')
$\endgroup$

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.