Обычно связь между двумя нодами в Blender создается простым перетаскиванием между нужными входными и выходными точками. Однако при необходимости соединять ноды можно и кодом в Blender Python API.
Все связи между нодами хранятся в структуре нодового дерева, как для шейдеров, так и для Geometry Nodes.
Shader Editor
Получить доступ к нодовому дереву материала можно через указатель на материал объекта.
Например, для активного меша:
1 2 |
bpy.context.object.active_material.node_tree # bpy.data.materials['Material'].node_tree |
Связи между нодами хранятся в коллекции links:
1 2 |
bpy.context.object.active_material.node_tree.links # bpy.data.materials['Simple Glitter'].node_tree.links |
Создать новый линк между двумя нодами можно при помощи команды коллекции new().
В вызываемую команду нужно передать два параметра:
- указатель на выходной сокет первого нода – откуда будет идти линк
- указатель на входной сокет второго нода – куда линк будет приходить
Указатель на нод можно получить по его имени из коллекции nodes нодового дерева:
1 2 |
bpy.context.object.active_material.node_tree.nodes['Emission'] # bpy.data.materials['Material'].node_tree.nodes["Emission"] |
Указатель на нужный выходной сокет можно получить из коллекции outputs нода. Его моно получить по порядковому индексу, или по имени.
1 2 3 4 5 |
bpy.context.object.active_material.node_tree.nodes['Emission'].outputs[0] # bpy.data.materials['Material.001'].node_tree.nodes["Emission"].outputs[0] bpy.context.object.active_material.node_tree.nodes['Emission'].outputs['Emission'] # bpy.data.materials['Material.001'].node_tree.nodes["Emission"].outputs[0] |
Указатель на входной сокет можно получить из коллекции inputs нода. Так же по номеру или по имени.
1 2 3 4 5 |
bpy.context.object.active_material.node_tree.nodes['Material Output'].inputs[0] # bpy.data.materials['Material.001'].node_tree.nodes["Material Output"].inputs[0] bpy.context.object.active_material.node_tree.nodes['Material Output'].inputs['Surface'] # bpy.data.materials['Material.001'].node_tree.nodes["Material Output"].inputs[0] |
Имея указатели на входной и выходной сокеты двух нодов, можно создать линк между ними:
1 2 3 4 |
bpy.context.object.active_material.node_tree.links.new( bpy.context.object.active_material.node_tree.nodes['Emission'].outputs['Emission'], bpy.context.object.active_material.node_tree.nodes['Material Output'].inputs['Surface'] ) |
Geometry Nodes Editor
Для нодов геометрии принцип создания линков между нодами точно такой же, как и для материалов.
Доступ к нодовому дереву для Geometry Nodes осуществляется через модификатор.
1 2 |
bpy.context.object.modifiers['GeometryNodes'].node_group # bpy.data.node_groups['Geometry Nodes'] |
Обратите внимание, что указатель на нодовое дерево в случае Geometry Nodes называется “node_group”.
В остальном все точно так же, как и для материалов.
Связи между нодами хранятся в коллекции links:
1 2 |
bpy.context.object.modifiers['GeometryNodes'].node_group.links # bpy.data.node_groups['Geometry Nodes'].links |
Линк между двумя нодами создается командой той же new(), в параметрах которой необходимо передать указатели на два сокета – выходной на первом ноде и входной на втором.
Указатель на нод мы получаем по имени из коллекции nodes нодового дерева:
1 2 |
bpy.context.object.modifiers['GeometryNodes'].node_group.nodes['Cube'] # bpy.data.node_groups['Geometry Nodes'].nodes["Cube"] |
Указатель на нужный выходной сокет мы получаем по индексу или по имени из коллекции outputs нода.
1 2 3 4 5 |
bpy.context.object.modifiers['GeometryNodes'].node_group.nodes['Cube'].outputs[0] # bpy.data.node_groups['Geometry Nodes'].nodes["Cube"].outputs[0] bpy.context.object.modifiers['GeometryNodes'].node_group.nodes['Cube'].outputs['Mesh'] # bpy.data.node_groups['Geometry Nodes'].nodes["Cube"].outputs[0] |
Указатель на входной сокет мы получаем из коллекции inputs нода, тоже по порядковому номеру или по имени.
1 2 3 4 5 |
bpy.context.object.modifiers['GeometryNodes'].node_group.nodes['Group Output'].inputs[0] # bpy.data.node_groups['Geometry Nodes'].nodes["Group Output"].inputs[0] bpy.context.object.modifiers['GeometryNodes'].node_group.nodes['Group Output'].inputs['Geometry'] # bpy.data.node_groups['Geometry Nodes'].nodes["Group Output"].inputs[0] |
Имея указатели на нужные сокеты – создадим линк между ними:
1 2 3 4 |
bpy.context.object.modifiers['GeometryNodes'].node_group.links.new( bpy.context.object.modifiers['GeometryNodes'].node_group.nodes['Cube'].outputs['Mesh'], bpy.context.object.modifiers['GeometryNodes'].node_group.nodes['Group Output'].inputs['Geometry'] ) |