Для того чтобы в Blender вынести значение сокета на панель модификатора Geometry Nodes нужно просто создать линк и соединить нужный сокет на нужном ноде с пустым сокетом на ноде Group Input. После этого в панели модификатора появляется поле, в котором можно менять значение нужного сокета. Далее это поле мы можем вынести на пользовательскую панель, обратившись к нему как к динамическому свойству.
Однако, таким образом на пользовательскую панель мы можем вынести только само поле. Что же делать, если мы хотим вынести туда же дополнительные свойства сокета, такие, например, как его минимальное и максимальное возможные значения?
Создадим для начала базовый класс пользовательской панели:
1 2 3 4 5 6 7 8 9 |
class TEST_PT_panel(bpy.types.Panel): bl_idname = 'TEST_PT_panel' bl_label = 'GN GROUP LEVEL OPTS' bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = 'GN' def draw(self, context): # draw function |
Не забудьте зарегистрировать его в Blender Python API, чтобы панель отобразилась в рабочей области 3D вьюпорта.
1 |
bpy.utils.register_class(TEST_PT_panel) |
Внутри функции draw() определим свойство, которое свяжем с нужным сокетом нода Geometry Nodes. Это то поле, которое мы вынесли на панель модификатора.
Получим указатель на модификатор Geometry Nodes.
1 |
modifier = context.active_object.modifiers['GeometryNodes'] |
И определим поле свойства на нашей панели.
1 2 3 4 5 |
self.layout.prop( data=modifier, property='["Socket_3"]', text='Level' ) |
Для того чтобы вынести на панель значения min/max для данного сокета, нам потребуется обратиться к ним уже напрямую через сокет.
Обратиться к сокету мы можем через объект interface нодового дерева.
Получим указатель на него.
1 |
interface = modifier.node_group.interface |
Указатели на все входные и выходные сокеты находятся в списке items_tree объекта interface.
Найдем нужный нам сокет, ориентируясь по его типу (входной/выходной) и имени.
1 |
socket = next((s for s in interface.items_tree if s.in_out == 'INPUT' and s.name == 'Level')) |
Свойства для установки максимального и минимального значения сокета называются “min_value” и “max_value”.
Имея указатель на сокет мы можем теперь вынести на пользовательскую панель эти его свойства, создав соответствующие свойства.
Для максимального значения:
1 2 3 4 |
self.layout.prop( data=socket, property='max_value' ) |
И для минимального:
1 2 3 4 |
self.layout.prop( data=socket, property='min_value' ) |
Полный код функции draw() нашей пользовательской панели:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def draw(self, context): # socket modifier = context.active_object.modifiers['GeometryNodes'] self.layout.prop( data=modifier, property='["Socket_3"]', text='Level' ) # min/max interface = modifier.node_group.interface socket = next((s for s in interface.items_tree if s.in_out == 'INPUT' and s.name == 'Level')) self.layout.prop( data=socket, property='max_value' ) self.layout.prop( data=socket, property='min_value' ) |
Таким образом мы сделали доступным редактирование самого значения сокета, а так же его максимального и минимального значений.