13

I am attempting to make a python script that creates a nodegroup based on some scene properties, however the group_make operator needs to be in a node editor context to run.

It seems awkward to try and make a node view temporarily while the script is running, as the plan is to create the nodegroup with a fake user and have the user add it from the add menu in the node editor.

How should I go about this?


Update: I have found that you can create node groups without a node editor with bpy.data.node_groups.new (thanks to ideasman42's comment here), however I still can't figure out how to add nodes to it.

How can I edit the nodes inside nodegroup without a node editor?

I can't find node_tree for my node group. Here is my problem:

eq_node = bpy.data.node_groups.new("Equal", "ShaderNodeTree")

tree = eq_node.node_tree #This gives "no such attribute 'node_tree'". How can I acces the node tree of the node group?
nodes = tree.nodes
links = tree.links

#Create nodes in node group here with nodes.new
gandalf3
  • 157,169
  • 58
  • 601
  • 1,133
  • Have a look at addons_contrib/online_mat_lib. It saves materials out to a text file which can then be loaded in another blend file, it saves groups and I'm pretty sure it re-creates them without the node view visible, and it is a large script. – sambler Dec 09 '13 at 09:08

1 Answers1

19

Thanks to iKlsR's response the complete answer here becomes mostly the same -

import bpy

# create a group
test_group = bpy.data.node_groups.new('testGroup', 'ShaderNodeTree')

# create group inputs
group_inputs = test_group.nodes.new('NodeGroupInput')
group_inputs.location = (-350,0)
test_group.inputs.new('NodeSocketFloat','in_to_greater')
test_group.inputs.new('NodeSocketFloat','in_to_less')

# create group outputs
group_outputs = test_group.nodes.new('NodeGroupOutput')
group_outputs.location = (300,0)
test_group.outputs.new('NodeSocketFloat','out_result')

# create three math nodes in a group
node_add = test_group.nodes.new('ShaderNodeMath')
node_add.operation = 'ADD'
node_add.location = (100,0)

node_greater = test_group.nodes.new('ShaderNodeMath')
node_greater.operation = 'GREATER_THAN'
node_greater.label = 'greater'
node_greater.location = (-100,100)

node_less = test_group.nodes.new('ShaderNodeMath')
node_less.operation = 'LESS_THAN'
node_less.label = 'less'
node_less.location = (-100,-100)

# link nodes together
test_group.links.new(node_add.inputs[0], node_greater.outputs[0])
test_group.links.new(node_add.inputs[1], node_less.outputs[0])

# link inputs
test_group.links.new(group_inputs.outputs['in_to_greater'], node_greater.inputs[0])
test_group.links.new(group_inputs.outputs['in_to_less'], node_less.inputs[0])

#link output
test_group.links.new(node_add.outputs[0], group_outputs.inputs['out_result'])

To perform the same in 2.66 or older use -

import bpy

# create a group
test_group = bpy.data.node_groups.new('testGroup', 'SHADER')

# create group inputs and outputs
test_group.inputs.new('in_to_greater','VALUE')
test_group.outputs.new('out_result','VALUE')
# add a node
node_add = test_group.nodes.new('MATH')
# link them
test_group.links.new(test_group.inputs[0], node_add.inputs[0])
test_group.links.new(node_add.outputs[0], test_group.outputs[0])
sambler
  • 55,387
  • 3
  • 59
  • 192