MRが楽しい

MRやVRについて学習したことを書き残す

Blender2.8で利用可能なpythonスクリプトを作る その53(アクティブなノードの入出力情報)

本日は 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ノード選択時
f:id:bluebirdofoz:20200718004811j:plain

・RGBミックスノード選択時
f:id:bluebirdofoz:20200718004821j:plain

名前指定でのノードの入出力情報

ノードの選択を名前で行う場合の実装例です。
・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"
)

f:id:bluebirdofoz:20200718004834j:plain