Класс для удобного создания нодов по их типу.
Автор кода: Skarn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
class NodeTreeBuilder: def __init__( self , node_tree : bpy.types.NodeTree , x : float = -200 , y : float = -200 , delimeter : float = 300 ): self._x = x self._y = y self.tree = node_tree self.delimeter = delimeter self.purge_tree() def purge_tree(self): for node in self.tree.nodes: self.tree.nodes.remove(node) def add_node( self , node_type : str , node_name : str , column : int , row : int , node_descr : str = "" ): node = self.tree.nodes.new(node_type) node.name = node_name node.label = node_descr if node_descr else node_name node.location = (self.delimeter * column + self._x, -self.delimeter * row + self._y) return node |
С этим классом удобно в одну строчку создавать ноды по текстовому представлению их типа. Тип любого нода указан в его свойстве bl_idname.
1 2 |
print(bpy.context.active_object.active_material.node_tree.nodes.active.bl_idname) 'ShaderNodeTexImage' |
Для создания экземпляра класса нужно передать в его входные параметры указатель на текущее нодовое дерево, то, в котором нужно создавать новые ноды. После чего для создания нового нода вызвать метод класса add_node, указав в параметрах тип нода, задаваемое для него имя и расположение индексами колонок и строк. Метод возвращает ссылку на созданный нод, что позволяет при необходимости легко менять его параметры со значений по умолчанию.
Пример использования класса в коде:
1 2 3 4 5 6 7 8 9 10 |
node_tree = bpy.context.active_object.active_material.node_tree tree_builder = NodeTreeBuilder(node_tree) uvmap = tree_builder.add_node('ShaderNodeUVMap', 'UVMap', 0, 1) uvmap.uv_map = 'UVMap' diffuse_tex = tree_builder.add_node('ShaderNodeTexImage', 'DiffuseTexture1', 1, 1) diffuse_tex.image = bpy.data.images['diffuse.jpg'] node_tree.links.new(uvmap.outputs['UV'], diffuse_tex.inputs['Vector']) |
Здесь мы создали экземпляр класса tree_builder для работы с текущим нодовым деревом node_tree. Далее мы создаем два нода UVMap и ImageTexture, меняем их параметры и соединяем их между собой.