MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その98(オペレータを利用せずに選択中の頂点から頂点グループを作成する)

本日は Blender の技術調査枠です。
Blender3.0で利用可能なpythonスクリプトを作ります。

前回記事

オペレータを利用して選択中の頂点から頂点グループを作成する記事は以下になります。
bluebirdofoz.hatenablog.com

選択中の頂点から頂点グループを作成する

オペレータを利用せずに選択中の頂点から頂点グループを作成するには以下を利用します。
・VertexGroups の new 関数
docs.blender.org
・VertexGroup の add 関数
docs.blender.org
・MeshVertex の select 変数
docs.blender.org

サンプルスクリプト

編集モードで選択中の頂点から新規頂点グループを作成するサンプルスクリプトです。
VertexGroup の add 関数は編集モードでは実行不可のため、途中でオブジェクトモードへの切り替えを行っています。
・Script_make_vertexgroup.py

# bpyインポート
import bpy

# 選択中の頂点から新規頂点グループを作成して頂点グループを取得する
def make_vertexgroup(arg_object:bpy.types.Object) -> bpy.types.VertexGroup:
    """選択中の頂点から新規頂点グループを作成して頂点グループを取得する

    Keyword Arguments:

    Returns:
        bpy.types.VertexGroup -- 新規頂点グループ
    """

    # 現在のモードがオブジェクトモードかチェックする
    # (VertexGroupのAddは編集モードで実行不可のため)
    if is_objectmode() == False :
        return None

    # 指定オブジェクトがメッシュか確認する
    if arg_object.type != 'MESH':
        # メッシュでない場合は処理しない
        return None

    # オブジェクトに新規頂点グループを追加する
    # VertexGroupsアクセスのマニュアル
    # (https://docs.blender.org/api/current/bpy.types.VertexGroups.html)
    vertexgroup = arg_object.vertex_groups.new()

    # インデックスリストを作成する
    index_list = []

    # 全ての頂点を走査する
    # 頂点操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.MeshVertex.html)
    for vert in arg_object.data.vertices:
        # 選択状態か否か
        if vert.select:
            # 選択中の頂点のインデックスをリストに追加する
            index_list.append(vert.index)

    # 選択中の頂点のインデックスを頂点グループに設定する
    # VertexGroupアクセスのマニュアル
    # (https://docs.blender.org/api/current/bpy.types.VertexGroup.html#bpy.types.VertexGroup)
    vertexgroup.add(index_list, 1.0, 'REPLACE')

    # 作成した頂点グループを返却する
    return vertexgroup

# オブジェクトモードに移行する
def set_objectmode():
    """オブジェクトモードに移行する

    Keyword Arguments:

    Returns:
    """

    # オブジェクトモードに移行する
    # モード切替のマニュアル
    # (https://docs.blender.org/api/current/bpy.ops.object.html#bpy.ops.object.mode_set)
    bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
    return

# 現在のモードがオブジェクトモードかチェックする
def is_objectmode() -> bool:
    """現在のモードがオブジェクトモードかチェックする

    Keyword Arguments:

    Returns:
        bool -- オブジェクトモードか否か
    """

    # 現在のモードをチェックする
    # (https://docs.blender.org/api/current/bpy.context.html#bpy.context.mode)
    return ('OBJECT' == bpy.context.mode)

# 編集モードに移行する
def set_editmode():
    """編集モードに移行する

    Keyword Arguments:

    Returns:
    """

    # 編集モードに移行する
    # モード切替のマニュアル
    # (https://docs.blender.org/api/current/bpy.ops.object.html#bpy.ops.object.mode_set)
    bpy.ops.object.mode_set(mode='EDIT', toggle=False)
    return

# 現在のモードが編集モードかチェックする
def is_editmode() -> bool:
    """現在のモードが編集モードかチェックする

    Keyword Arguments:

    Returns:
        bool -- 編集モードか否か
    """

    # 現在のモードをチェックする
    # (https://docs.blender.org/api/current/bpy.context.html#bpy.context.mode)
    return ('EDIT_MESH' == bpy.context.mode)

# 関数の実行例
# オブジェクトモードに移行する
set_objectmode()
# 編集中のアクティブオブジェクトを取得する
target_object = bpy.context.view_layer.objects.active
# 選択中の頂点から新規頂点グループを作成してグループ名を取得する
vertexgroup = make_vertexgroup(target_object)
# 編集モードに戻す
set_editmode()
# 結果をコンソールに表示する
print("VertexGroup : " + vertexgroup.name)

・実行前
f:id:bluebirdofoz:20220209231704j:plain

・実行後
f:id:bluebirdofoz:20220209231713j:plain
f:id:bluebirdofoz:20220209231721j:plain
f:id:bluebirdofoz:20220209231729j:plain