本日は Blender の技術調査枠です。
Blender2.8で利用可能なpythonスクリプトを作ります。
アクティブなノードの入出力情報
現在、ビューポート上でアクティブなノードの入出力情報を標準出力に表示します。
選択切り替えで各種ノードの入出力の名前とクラスを確認できるので開発時に便利です。
・Script_check_node_info_Active.py
# bpyインポート import bpy # 指定ノードの入出力情報を標準出力に表示する def check_node_info(arg_node:bpy.types.Node) -> bool: """指定ノードの入出力情報を標準出力に表示する Args: arg_node (bpy.types.Node): 指定ノード Returns: bool: 実行正否 """ print(arg_node.name) # ノードの入力情報をチェックして標準出力に表示する check_node_inputs(arg_node) # ノードの出力情報をチェックして標準出力に表示する check_node_outputs(arg_node) return True # 指定ノードの入力情報を標準出力に表示する def check_node_inputs(arg_node:bpy.types.Node): """指定ノードの入力情報を標準出力に表示する Args: arg_node (bpy.types.Node): 指定ノード """ print("input info") print('') # ノードの入力情報を走査する for index in range(len(arg_node.inputs)): print("No." + str(index)) # インデックスナンバー print(arg_node.inputs[index].name) # 名称 print(type(arg_node.inputs[index])) # クラス print('') return # 指定ノードの出力情報を標準出力に表示する def check_node_outputs(arg_node:bpy.types.Node): """指定ノードの出力情報を標準出力に表示する Args: arg_node (bpy.types.Node): 指定ノード """ print("output info") print('') # ノードの出力情報を走査する for index in range(len(arg_node.outputs)): print("No." + str(index)) # インデックスナンバー print(arg_node.outputs[index].name) # 名称 print(type(arg_node.outputs[index])) # クラス print('') return # 現在アクティブなオブジェクトを取得する active_object = bpy.context.view_layer.objects.active if active_object != None: # 現在アクティブなマテリアルを取得する active_material = active_object.active_material if active_material != None: # 現在アクティブなノードを取得する active_node = active_material.node_tree.nodes.active # アクティブなノードの情報を標準出力に表示する check_node_info(arg_node=active_node)
・プリンシプルBSDFノード選択時
・RGBミックスノード選択時
名前指定でのノードの入出力情報
ノードの選択を名前で行う場合の実装例です。
・Script_check_node_info.py
# bpyインポート import bpy # 指定ノードの入出力情報を標準出力に表示する # (オブジェクト名指定) def check_node_info_checker(arg_objectname="Default", arg_materialname="DefaultMaterial", arg_nodename="DefaultNode") -> bool: """指定ノードの入出力情報を標準出力に表示する(オブジェクト名指定) Args: arg_objectname (str, optional): 指定オブジェクト名. Defaults to "Default". arg_materialname (str, optional): 指定マテリアル名. Defaults to "DefaultMaterial". arg_nodename (str, optional): 指定ノード名. Defaults to "DefaultNode". Returns: bool: 実行正否 """ # 指定オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) selectob = bpy.data.objects.get(arg_objectname) # 指定オブジェクトが存在するか確認する if selectob == None: # 指定オブジェクトが存在しない場合は処理しない return False # 指定オブジェクトがメッシュオブジェクトか確認する if selectob.type != 'MESH': # メッシュオブジェクトでない場合は処理しない return False # 指定マテリアルスロットを取得する selectmatslot = selectob.material_slots.get(arg_materialname) # 指定マテリアルスロットが存在するか確認する if selectmatslot == None: # 指定オブジェクトが存在しない場合は処理しない return False # 指定マテリアルを取得する selectmat = selectmatslot.material # 指定マテリアルが存在するか確認する if selectmat == None: # 指定オブジェクトが存在しない場合は処理しない return False # 指定ノードを取得する selectnode = selectmat.node_tree.nodes.get(arg_nodename) # 指定ノードが存在するか確認する if selectnode == None: # 指定オブジェクトが存在しない場合は処理しない return False # 指定ノードの入出力情報を標準出力に表示する result = check_node_info(arg_node=selectnode) return True # 指定ノードの入出力情報を標準出力に表示する def check_node_info(arg_node:bpy.types.Node) -> bool: """指定ノードの入出力情報を標準出力に表示する Args: arg_node (bpy.types.Node): 指定ノード Returns: bool: 実行正否 """ print(arg_node.name) # ノードの入力情報をチェックして標準出力に表示する check_node_inputs(arg_node) # ノードの出力情報をチェックして標準出力に表示する check_node_outputs(arg_node) return True # 指定ノードの入力情報を標準出力に表示する def check_node_inputs(arg_node:bpy.types.Node): """指定ノードの入力情報を標準出力に表示する Args: arg_node (bpy.types.Node): 指定ノード """ print("input info") print('') # ノードの入力情報を走査する for index in range(len(arg_node.inputs)): print("No." + str(index)) # インデックスナンバー print(arg_node.inputs[index].name) # 名称 print(type(arg_node.inputs[index])) # クラス print('') return # 指定ノードの出力情報を標準出力に表示する def check_node_outputs(arg_node:bpy.types.Node): """指定ノードの出力情報を標準出力に表示する Args: arg_node (bpy.types.Node): 指定ノード """ print("output info") print('') # ノードの出力情報を走査する for index in range(len(arg_node.outputs)): print("No." + str(index)) # インデックスナンバー print(arg_node.outputs[index].name) # 名称 print(type(arg_node.outputs[index])) # クラス print('') return # 関数の実行例 check_node_info_checker( arg_objectname="Cube", arg_materialname="Mix", arg_nodename="Principled BSDF" )