В Blender в процессе создания сложных процедурных материалов или нод геометрии нодовое дерево часто смещается от начальной точки координат рабочей области. Позднее, при работе с материалами, это доставляет некоторые неудобства т.к. при переключении с материала на материал, нодовое дерево “убегает” и приходится каждый раз скроллировать экран, чтобы добраться до нодов. Эту проблему можно решить при помощи несложного скрипта, который сдвинет все нодовое дерево в начало координат рабочей области.
Чтобы сместить все нодовое дерево к началу координат без искажений, мы будем отталкиваться от текущего активного нода. Сместим его в начало координат рабочей области, точку (0.0, 0.0). Все остальные ноды сместим относительно него на точно такое же расстояние.
Shader Editor
Возьмем текущий активный нод
1 |
active_node = bpy.context.object.active_material.node_tree.nodes.active |
Получим его координаты
1 |
active_node_co = active_node.location.copy() |
Это и есть тот вектор смещения, на который нам нужно сдвинуть все ноды.
Используем copy() чтобы получить статическую копию значений, иначе, когда нод сместится в начало координат, нужные значения будут потеряны.
Теперь для каждого нода пересчитаем координаты, вычитая из текущих координат нода полученное смещение.
1 2 |
for node in bpy.context.object.active_material.node_tree.nodes: node.location -= active_node_co |
Полный код скрипта:
1 2 3 4 5 |
active_node = bpy.context.object.active_material.node_tree.nodes.active active_node_co = active_node.location.copy() for node in bpy.context.object.active_material.node_tree.nodes: node.location -= active_node_co |
Выполним этот скрипт для каждого материала и централизуем окно рабочей области редактора нажатием клавиши с точкой (Del) на цифровой части клавиатуры.
Теперь при переключении материалов больше не нужно скроллировать окно в поисках нод, оно всегда будет отцентрировано по начальной точке.
Geometry Nodes Editor
Для рабочей области Geometry Nodes все работает точно так же.
Активный нод:
1 |
active_node = bpy.context.object.modifiers['GeometryNodes'].node_group.nodes.active |
Статическая копия вектор смещения:
1 |
active_node_co = active_node.location.copy() |
Сдвигаем каждый нод на полученное смещение:
1 2 |
for node in bpy.context.object.modifiers['GeometryNodes'].node_group.nodes: node.location -= active_node_co |
Полный код скрипта:
1 2 3 4 5 |
active_node = bpy.context.object.modifiers['GeometryNodes'].node_group.nodes.active active_node_co = active_node.location.copy() for node in bpy.context.object.modifiers['GeometryNodes'].node_group.nodes: node.location -= active_node_co |