本日は Blender の技術調査枠です。
Blender2.8で利用可能なpythonスクリプトを作ります。
対象オブジェクトに新規頂点カラーレイヤーを作成する
対象オブジェクトに新規頂点カラーレイヤーを作成します。
作成した頂点カラーレイヤーの名称を返します。作成失敗時は空文字を返します。
・check_vertexcolor_name.py
# bpyインポート import bpy # 対象オブジェクトに新規頂点カラーレイヤーを作成する def add_vertexcolor_target(arg_objectname="Default") -> str: """対象オブジェクトに新規頂点カラーレイヤーを作成する Keyword Arguments: arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"}) Returns: str -- 作成した頂点カラーレイヤーの名前(作成失敗は空文字) """ # 指定オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) selectob = bpy.data.objects.get(arg_objectname) # 指定オブジェクトが存在するか確認する if selectob == None: # 指定オブジェクトが存在しない場合は処理しない return "" # 指定オブジェクトがメッシュオブジェクトか確認する if selectob.type != 'MESH': # メッシュオブジェクトでない場合は処理しない return "" # オブジェクトをアクティブにする bpy.context.view_layer.objects.active = selectob # 頂点カラーレイヤーを作成する bpy.ops.mesh.vertex_color_add() # 対象オブジェクトのメッシュデータを取得する # メッシュデータのインタフェース # (https://docs.blender.org/api/current/bpy.types.Mesh.html) meshdata = selectob.data # 頂点カラーレイヤーのリストを取得する # 頂点カラーレイヤーのリストのインタフェース # (https://docs.blender.org/api/current/bpy.types.LoopColors.html) vertexcolors = meshdata.vertex_colors # 作成した頂点カラーレイヤーの参照を取得する add_vertexcolor = vertexcolors[-1] return add_vertexcolor.name # 関数の実行例 add_name = add_vertexcolor_target(arg_objectname="Sphere") print("result : " + add_name)
対象オブジェクトに指定名称の頂点カラーレイヤーが設定されているかチェックする
対象オブジェクトに指定名称の頂点カラーレイヤーが設定されている場合は True を返します。
指定名称の頂点カラーレイヤーが存在しない場合や、頂点カラーレイヤーが1つも存在しない場合は False を返します。
・check_vertexcolor_name.py
# bpyインポート import bpy # 対象オブジェクトに指定名称の頂点カラーレイヤーが設定されているかチェックする def check_vertexcolor_name(arg_objectname="Default", arg_checkname="Col") -> bool: """対象オブジェクトに指定名称の頂点カラーレイヤーが設定されているかチェックする Keyword Arguments: arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"}) arg_checkname {str} -- 指定名称 (default: {"Col"}) Returns: bool -- 頂点カラーレイヤーの有無 """ # 指定オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) selectob = bpy.data.objects.get(arg_objectname) # 指定オブジェクトが存在するか確認する if selectob == None: # 指定オブジェクトが存在しない場合は処理しない return False # 指定オブジェクトがメッシュオブジェクトか確認する if selectob.type != 'MESH': # メッシュオブジェクトでない場合は処理しない return False # オブジェクトをアクティブにする bpy.context.view_layer.objects.active = selectob # 対象オブジェクトのメッシュデータを取得する # メッシュデータのインタフェース # (https://docs.blender.org/api/current/bpy.types.Mesh.html) meshdata = selectob.data # 頂点カラーレイヤーのリストを取得する # 頂点カラーレイヤーのリストのインタフェース # (https://docs.blender.org/api/current/bpy.types.LoopColors.html) vertexcolors = meshdata.vertex_colors # 頂点カラーレイヤーの数を確認する if len(vertexcolors) < 1: # 頂点カラーレイヤーが1つも存在しなければ False を返す return False # 指定名称の頂点カラーレイヤーを取得する # (get関数は対象が存在しない場合 None が返る) target_vertexcolor = vertexcolors.get(arg_checkname) # 指定名称の頂点カラーレイヤーが存在するか確認する if target_vertexcolor == None: # 指定名称の頂点カラーレイヤーが存在しなければ False を返す return False # 指定名称の頂点カラーレイヤーが存在していれば True を返す return True # 関数の実行例 result = check_vertexcolor_name( arg_objectname="Sphere", arg_checkname="Col" ) print("result : " + str(result))
レンダリング時に有効な頂点カラーレイヤーの名前を取得する
レンダリング時に有効な頂点カラーレイヤーの名称を返します。
取得失敗時は空文字を返します。
・get_vertexcolor_active.py
# bpyインポート import bpy # レンダリング時に有効な頂点カラーレイヤーの名前を取得する def get_vertexcolor_active(arg_objectname="Default") -> str: """レンダリング時に有効な頂点カラーレイヤーの名前を取得する Keyword Arguments: arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"}) Returns: str -- レンダリング時に有効な頂点カラーレイヤーの名前(取得失敗は空文字) """ # 指定オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) selectob = bpy.data.objects.get(arg_objectname) # 指定オブジェクトが存在するか確認する if selectob == None: # 指定オブジェクトが存在しない場合は処理しない return "" # 指定オブジェクトがメッシュオブジェクトか確認する if selectob.type != 'MESH': # メッシュオブジェクトでない場合は処理しない return "" # オブジェクトをアクティブにする bpy.context.view_layer.objects.active = selectob # 対象オブジェクトのメッシュデータを取得する # メッシュデータのインタフェース # (https://docs.blender.org/api/current/bpy.types.Mesh.html) meshdata = selectob.data # 頂点カラーレイヤーのリストを取得する # 頂点カラーレイヤーのリストのインタフェース # (https://docs.blender.org/api/current/bpy.types.LoopColors.html) vertexcolors = meshdata.vertex_colors # 変数の初期化 render_index = -1 # 頂点カラーレイヤーを走査する for index in range(0, len(vertexcolors)): # レンダリング時の有効無効をチェックする if vertexcolors[index].active_render == True: # レンダリング時に有効な頂点カラーレイヤーのインデックスを取得する render_index = index # 有効なインデックスが取得できたか確認する if render_index == -1: # 取得できなかった場合は空文字を返す return "" # レンダリング時に有効な頂点カラーレイヤーの参照を取得する active_vertexcolor = vertexcolors[render_index] return active_vertexcolor.name # 関数の実行例 get_name = get_vertexcolor_active(arg_objectname="Sphere") print("result : " + get_name)