Начиная с версии 4.0 в Blender Geometry Nodes появилась специальная группа нод, предназначенная для циклического выполнения участка нодового дерева, заданное число раз. Эта группа нод называется Repeat Zone.
Для обычного пользователя группа Repeat Zone добавляется в нодовое дерево Geometry Nodes обычным образом – shift + a – Utilities – Repeat Zone. После выполнения этого действия в нодовое дерево добавляются сразу два нода, уже образующие нужную связку.
Для того чтобы добавить эту группу нод через Blender Python API, нужно выполнить немного больше действий, чем при добавлении обычных нод.
Для начала получим указатель на нодовое дерево Geometry Nodes.
1 |
gn_node_tree = bpy.context.object.modifiers['Geometry Nodes'].node_group |
Имея указатель на нодовое дерево, можно приступить к добавлению в него нод.
В первую очередь нам нужно добавить нод “Repeat Output”. Порядок создания нод важен – при добавлении последующих нод мы будем обращаться к уже добавленным, т.е. они должны уже существовать в нодовом дереве.
Нод “Repeat Output” мы добавляем обычным способом, как и любой другой нод, по его типу.
1 |
repeat_output = gn_node_tree.nodes.new('GeometryNodeRepeatOutput') |
Имея нод “Repeat Output”, мы можем сразу добавить, если это необходимо, дополнительные входы-выходы. Дополнительные входы-выходы создаются через коллекцию “repeat_items”, указатель на которую мы получим через Repeat Output нод.
Для примера, добавим дополнительное поле для задания числа с плавающей точкой – тип Float с именем “float_field”.
1 |
repeat_output.repeat_items.new('FLOAT', 'float_field') |
Теперь добавим в нодовое дерево второй нод – “Repeat Input”:
1 |
repeat_input = gn_node_tree.nodes.new('GeometryNodeRepeatInput') |
Сейчас оба добавленных нода не связаны в группу, и поэтому они не образуют единой Repeat Zone, которая нам нужна.
Чтобы связать оба нода в единую зону, нужно для нода Repeat Input выполнить функцию pair_with_output(), передав в параметре указатель на нод Repeat Output.
Нод Repeat Output мы уже создали, поэтому можем просто вызвать функцию:
1 |
repeat_input.pair_with_output(repeat_output) |
Теперь оба нода связаны в одну зону.
Обратите внимание, что для нода Repeat Input нет необходимости создавать дополнительные входы-выходы. После связке нодов в зону, они создались автоматически.
Последнее, что нам осталось, это создать линк по входам-выходам “Geometry” у обоих нодов:
1 |
gn_node_tree.links.new(repeat_input.outputs['Geometry'], repeat_output.inputs['Geometry']) |
Теперь наша новая Repeat Zone полностью готова к работе.