Geometry Nodes: improve operators for node editor header

This allows users to create new modifiers directly from the
Geometry Nodes Editor.
This commit is contained in:
Hans Goudey 2020-12-01 21:35:26 +01:00 committed by Jacques Lucke
parent 600fb28b62
commit b1d1a58c77
Notes: blender-bot 2023-02-14 07:53:51 +01:00
Referenced by commit b75552ebbb, UI: Draw socket type colors on the left in group sockets list
2 changed files with 62 additions and 15 deletions

View File

@ -18,6 +18,20 @@
import bpy
def geometry_node_group_empty_new(context):
group = bpy.data.node_groups.new("Geometry Nodes", 'GeometryNodeTree')
group.inputs.new('NodeSocketGeometry', "Geometry")
group.outputs.new('NodeSocketGeometry', "Geometry")
input_node = group.nodes.new('NodeGroupInput')
output_node = group.nodes.new('NodeGroupOutput')
output_node.is_active_output = True
input_node.location.x = -200 - input_node.width
output_node.location.x = 200
group.links.new(output_node.inputs[0], input_node.outputs[0])
return group
def geometry_modifier_poll(context) -> bool:
ob = context.object
@ -28,11 +42,11 @@ def geometry_modifier_poll(context) -> bool:
return True
class NewGeometryNodeModifier(bpy.types.Operator):
"""Create a new modifier with a new geometry node group"""
class NewGeometryNodeTree(bpy.types.Operator):
"""Create a new geometry node tree"""
bl_idname = "node.new_geometry_node_tree"
bl_label = "New Geometry Node Tree"
bl_idname = "node.new_geometry_node_modifier"
bl_label = "New Geometry Node Modifier"
bl_options = {'REGISTER', 'UNDO'}
@classmethod
@ -40,21 +54,41 @@ class NewGeometryNodeTree(bpy.types.Operator):
return geometry_modifier_poll(context)
def execute(self, context):
group = bpy.data.node_groups.new("Geometry Nodes", 'GeometryNodeTree')
group.inputs.new('NodeSocketGeometry', "Geometry")
group.outputs.new('NodeSocketGeometry', "Geometry")
input_node = group.nodes.new('NodeGroupInput')
output_node = group.nodes.new('NodeGroupOutput')
output_node.is_active_output = True
modifier = context.object.modifiers.new("Empty", "NODES")
input_node.location.x = -200 - input_node.width
output_node.location.x = 200
if not modifier:
return {'CANCELLED'}
group.links.new(output_node.inputs[0], input_node.outputs[0])
group = geometry_node_group_empty_new(context)
modifier.node_group = group
return {'FINISHED'}
class NewGeometryNodeTreeAssign(bpy.types.Operator):
"""Create a new geometry node group and assign it the the active modifier"""
bl_idname = "node.new_geometry_node_group_assign"
bl_label = "Assign New Geometry Node Group"
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll(cls, context):
return geometry_modifier_poll(context)
def execute(self, context):
modifier = context.object.modifiers.active
if not modifier:
return {'CANCELLED'}
group = geometry_node_group_empty_new(context)
modifier.node_group = group
return {'FINISHED'}
classes = (
NewGeometryNodeTree,
NewGeometryNodeModifier,
NewGeometryNodeTreeAssign,
)

View File

@ -154,7 +154,20 @@ class NODE_HT_header(Header):
elif snode.tree_type == 'GeometryNodeTree':
NODE_MT_editor_menus.draw_collapsible(context, layout)
layout.separator_spacer()
layout.template_ID(snode, "node_tree", new="node.new_geometry_node_tree")
ob = context.object
row = layout.row()
if snode.pin:
row.enabled = False
row.template_ID(snode, "node_tree", new="node.new_geometry_node_group_assign")
elif ob:
active_modifier = ob.modifiers.active
if active_modifier and active_modifier.type == "NODES":
row.template_ID(active_modifier, "node_group", new="node.new_geometry_node_group_assign")
else:
row.template_ID(snode, "node_tree", new="node.new_geometry_node_modifier")
else:
# Custom node tree is edited as independent ID block