My goal is to add a NodeGroup I created earlier to the shader nodetree of an object using python. (Actually a few hundred times, hence the script)

This is what I know how to do:

  • iterate over all the objects of which I need to change the Material.

Here is where I get stuck:

  • I can add a new NodeGroup with object.data.materials[0].node_tree.nodes.new("ShaderNodeGroup") This only creates a generic NodeGroup and I'm unable to select the actual Nodetree within this new Group.
  • py.ops.node.add_node(type="ShaderNodeGroup", use_transform=True, settings=[{"name":"node_tree", "value":"bpy.data.node_groups['MyNodeGroup']"}]) is the operator to add the Nodegroup that I want, but when I try to use that in my script, I get an error that I'm in the wrong context.

How can I make any of these methods work for my script?


You can do something like this: create the node group instance and set the existing node group as node tree for this new instance.

import bpy

C = bpy.context

def instantiate_group(nodes, data_block_name):
    group = nodes.new(type='ShaderNodeGroup')
    group.node_tree = bpy.data.node_groups[data_block_name]
    return group

instantiate_group(C.object.material_slots[0].material.node_tree.nodes, 'NodeGroup')
  • $\begingroup$ Thank you! "Especially group.node_tree = bpy.data.node_groups[group_name]" solved my problem! $\endgroup$ – michaelh Sep 5 '19 at 16:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.