Когда мы строим нодовое дерево Geometry Nodes при помощи скрипта, после построения самого нодового дерева, aтрибутам Geometry Nodes.нужно назначить имена для того, чтобы обращаться к этим атрибутам из других рабочих областей, например, из шейдерного дерева.
Если в настройках Blender включена опция “Python ToolTips”, во всплывающей по наведению курсора на поле подсказке можно посмотреть каким образом происходит обращение к атрибуту.
Как мы видим из подсказки, адресация к атрибуту происходит по текстовому идентификатору, как к динамическому свойству модификатора Geometry Nodes.
Таки образом мы можем обращаться к этому атрибуту:
1 2 3 |
bpy.data.objects["Cube"].modifiers["gn"]["Output_2_attribute_name"] = '_NEW_VALUE' print(bpy.data.objects["Cube"].modifiers["gn"]["Output_2_attribute_name"]) # '_NEW_VALUE' |
Однако, если мы работаем с атрибутом через скрипт, его текстовой идентификатор нам не известен.
К тому же, каждый раз при создании атрибута, его идентификатор будет другим. Это можно легко проверить, удалив выход из дерева нодов Geometry Nodes и создав его заново.
Список всех идентификаторов атрибутов Geometry Nodes мы можем получить при помощи метода keys() модификатора:
1 2 3 |
modif = bpy.context.active_object.modifiers['gn'] print(list(modif.keys())) # ['Output_2_attribute_name', 'Output_3_attribute_name', 'Output_4_attribute_name'] |
Для того, чтобы правильно ассоциировать с каждым из атрибутов нужный выход дерева нодов Geometry Nodes, мы можем связать их по индексам.
Порядок выходов дерева нодов соответствует порядку идентификаторов, полученных через keys(), это можно легко проверить, поменяв несколько выходов местами и сравнив их с полученным через keys() списком идентификаторов.
Получить индекс нужного выхода по его имени в Geometry Nodes можно из списка выходов нодового дерева:
1 2 3 |
index = [o.name for o in modif.node_group.outputs].index('factor') print(index) # 1 |
По этому индексу мы можем получить нужный идентификатор атрибута:
1 2 |
print(list(modif.keys())[index - 1]) # Output_2_attribute_name |
Для получения идентификатора атрибута мы используем индекс на единицу меньший, чем мы получили с выхода нодового дерева т.к. первый выход Geometry не образует атрибута в модификаторе.
По полученному идентификатору мы теперь можем обращаться к атрибуту:
1 2 3 |
modif[list(modif.keys())[index - 1]] = '_ANOTHER_NEW_VALUE' print(modif[list(modif.keys())[index - 1]]) # _ANOTHER_NEW_VALUE |
Для дополнительной проверки соответствия атрибута нужному выходу можно проверять вхождение идентификатора выхода в идентификатор атрибута:
1 2 |
modif.node_group.outputs['factor'].identifier in list(modif.keys())[index - 1] # True |
Авторы решения: randum, Iyad Ahmed