テキストベースでBlenderを使用するにあったって、なくてもいいけどあるとコーディングの大幅な時間短縮になる、選択した面、辺、頂点のインデックスのリストを取得する処理を実装しておきます。
- 複数の要素に対して変形を移動を行いたい場合
- UV展開時にシーム追加するために大量の辺を選択する場合
動作確認環境 : Blender 4.2
選択した面/辺/頂点インデックスリスト取得
3D View上である複数の辺や面、頂点を選択した状態で、次のコードを実行することで、要素の指定に使うことのできるインデックスのリストを取得することができます。
Python :
import bpy
def get_selected_elements():
"""
選択された頂点、エッジ、面のインデックスを取得して表示する。
"""
# アクティブなオブジェクトを取得
obj = bpy.context.object
if obj and obj.type == 'MESH':
# メッシュデータを取得
mesh = obj.data
# Mode切り替え
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.object.mode_set(mode='OBJECT')
# 選択された頂点のインデックスを取得
selected_vertex_indices = [v.index for v in mesh.vertices if v.select]
# 選択されたエッジのインデックスを取得
selected_edge_indices = [e.index for e in mesh.edges if e.select]
# 選択された面のインデックスを取得
selected_face_indices = [f.index for f in mesh.polygons if f.select]
# 選択された頂点、エッジ、面のインデックスを表示
print("--------------------------------------------------------------")
print("Selected Vertex Indices:", selected_vertex_indices)
print("--------------------------------------------------------------")
print("Selected Edge Indices:", selected_edge_indices)
print("--------------------------------------------------------------")
print("Selected Face Indices:", selected_face_indices)
# 選択されていない場合のメッセージ
if not selected_vertex_indices and not selected_edge_indices and not selected_face_indices:
print("No vertices, edges, or faces selected.")
else:
print("No mesh object selected.")
# 実行
get_selected_elements()
Edit Modeでマウスでいくつかの面を選択した状態で、上記コードを実行すると次のように出力されます。
出力は、
- Blender右上「Window」→「Toggle System Console」
出力例 :
--------------------------------------------------------------
Selected Vertex Indices: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 64, 65, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 89, 90, 91, 92, 93, 94, 95, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118]
--------------------------------------------------------------
Selected Edge Indices: [1, 5, 8, 14, 17, 20, 23, 26, 96, 97, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 121, 122, 123, 124, 125, 127, 128, 129, 152, 153, 154, 155, 156, 157, 158, 159, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 192, 193, 194, 195, 196, 197, 198, 199, 201, 203, 205, 207, 209, 213, 216, 219, 222]
--------------------------------------------------------------
Selected Face Indices: [30, 33, 57, 58, 59, 60, 61, 63, 64, 66, 67, 68, 69, 70, 72, 74, 76, 78, 80, 83, 86, 89, 92, 95]
ここで取得できたインデックスをコピペでコードに張り付けると、手動で個々に入力するより効率的に作業をすすめられます。
インデックスリスト取得が必要になる例
簡単にシームをマークして、UV展開を行う処理の記述を例にします。
Python:
def Base_create():
# Mode切り替え
bpy.ops.object.mode_set(mode='OBJECT')
# 立方体生成
bpy.ops.mesh.primitive_cube_add(
size=1
, location=(0, 0, 0)
, scale=(1,1,1)
)
bpy.context.object.name = "MyCube_001"
# Mode切り替え
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_mode(type='EDGE')
# 要素選択
element_select(
element_list=[0, 1, 2, 6, 8, 10, 11
]
, select_mode="EDGE"
, object_name_list=["MyCube_001"]
)
# シームをマーク
bpy.ops.mesh.mark_seam(clear=False)
# ----------------------------------
# UV展開
# ----------------------------------
# 要素選択
element_select(
element_list=["all"]
, select_mode="FACE"
, object_name_list=["MyCube_001"]
)
# UV 展開
bpy.ops.uv.unwrap(method='ANGLE_BASED', margin=0)
Base_create()
▼element_select
20行目 :
ここでは単なる立方体なので、7辺程度しか選択せずともある程度整ったUV展開が可能ですが、ベベルなどを追加して、モディファイアの適用を行ったあとのオブジェクトに対してUV展開を行う場合など、急激に選択しなければいけない辺の数が増えます。
このような場合、マウスである程度辺を選択してから辺のインデックスを取得するスクリプトを実行することで、効率的に作業が進められます。
以上