本日は 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)
・実行前
・実行後