我们可以按类型获取所有可用着色器节点的列表。
首先,将任何对象添加到场景中,例如多维数据集,为其创建材质,然后删除所有节点。在此材料中,我们将显示Blender中可用的所有着色器节点。
我们可以使用“ bpy.types”结构获取所有可用的着色器节点类型。它存储Blender API中可用的所有对象类型的列表,包括节点。
执行此命令
dir(bpy.types)
# 'ANIM_OT_clear_useless_actions', 'ANIM_OT_keying_set_export', 'ANIM_OT_update_animated_transform_constraints', 'Action', ...
我们将获得通过Blender Python API提供的所有对象类型的名称的列表。
所有类型的着色器节点都从“ Shadernode”类型继承。因此,要仅从常规列表中获取着色器节点类型,我们需要检查特定类型是否从“ ShaderNode”继承。
可以使用以下命令执行从一种类型到另一种类型的继承检查
issubclass(_CHECK_TYPE_, _PARENT_TYPE_)
如果_CHECK_TYPE_类型是从_PARENT_TYPE_类型继承的,则它将返回“ True”。
“ issubclass”函数比较类型,但不比较我们通过“ dir”函数获得的文本标识符。为了通过文本名称获取类型本身,我们使用以下事实:在Python中,任何类型都同时是描述它的模块的属性。因此,我们可以使用以下命令获取“ bpy.types”中描述的类型:
getattr(bpy.types, _TEXT_TYPE_)
有了节点类型列表,我们可以按节点类型将节点本身添加到当前材料中。
指向当前节点树的指针,可以在其中添加节点,如下所示:
import bpy
node_tree = bpy.context.object.active_material.node_tree
为节点的位置设置初始值。
Python
location_x = 0
location_y = 0
让我们循环浏览所有可能的API对象类型:
for type in dir(bpy.types):
real_type = getattr(bpy.types, type)
并且类型是否继承自“ ShaderNode”
if issubclass(real_type, bpy.types.ShaderNode):
将这种类型的节点添加到节点树,并为其设置宽度和偏移量。
node = node_tree.nodes.new(type)
node.width = 250
node.location = (location_x, location_y)
location_x = 300
if location_x > 3000:
location_x = 0
location_y -= 600
最终代码:
import bpy
node_tree = bpy.context.object.active_material.node_tree
location_x = 0
location_y = 0
for type in dir(bpy.types):
real_type = getattr(bpy.types, type)
if issubclass(real_type, bpy.types.ShaderNode):
try:
node = node_tree.nodes.new(type)
node.width = 250
node.location = (location_x, location_y)
location_x = 300
if location_x > 3000:
location_x = 0
location_y -= 600
except:
pass
我们将在“ try –except”块中封闭将节点添加到节点树的代码部分,以防止在尝试创建没有可视形式的抽象节点(例如“ ShaderNode”)时出错。
执行此代码后,所有可用节点将被顺序添加到材料中
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved