Для работы с геометрией объектов в Blender очень часто нужно знать, какой именно вертекс (ребро или грань) в данный момент являются активными. Определить активные элементы геометрии меша не сложно при помощи Blender Python API.
Давайте разберем, как мы можем получить указатель на активный вертекс, активное ребро или активный полигон для текущего объекта в Blender сцене.
Чтобы работать с геометрией меша, сначала необходимо переключиться в объектный режим.
|
1 |
bpy.ops.object.mode_set(mode='OBJECT') |
Активный полигон
Получить активный полигон для текущего объекта проще всего. В списке полигонов меша есть свойство “active”, в котором хранится индекс текущего активного полигона.
|
1 2 |
active_face_index = bpy.context.object.data.polygons.active # 5 |
Получить указатель на полигон по индексу можно из того же самого списка.
|
1 2 3 |
active_face = bpy.context.object.data.polygons[active_face_index] # <bpy_struct, MeshPolygon at 0x00000162C7A86D2C> |
Активный вертекс
Получить указатель на активный вертекс объекта мы можем при помощи объекта bmesh и его списка “select_history” в котором хранится вся история выделений геометрии. Активный вертекс – это всегда последний выделенный вертекс в истории выделений.
Создадим объект bmesh и сбросим в него геометрию текущего меша. Также согласуем порядок индексов в bmesh с порядком индексов в исходной геометрии меша.
|
1 2 3 |
bm = bmesh.new() bm.from_mesh(bpy.context.active_object.data) bm.verts.ensure_lookup_table() |
Обратимся к истории выделения, если она существует, и получим последний в списке объект нужного там типа – вертекс.
|
1 2 3 4 |
active_vertex = None if bm.select_history: active_vertex_bm = next((_vertex for _vertex in reversed(bm.select_history) \ if isinstance(_vertex, bmesh.types.BMVert)), None) |
Для быстроты поиска, мы реверсируем список выделения и берем первый элемент в нем нужного нам типа. Если выделенных вертексов в истории не находится, мы получаем None.
Пока мы получили указатель на объект типа BMVert – тпп вертекса в объекте bmesh. Нам же нужно получить указатель на сам вертекс в исходной геометрии меша. Мы можем получить его по индексу, именно для этого мы заранее приводили индексы исходной геометрии и bmesh в соответствие.
|
1 2 3 |
active_vertex = bpy.context.object.data.vertices[active_vertex_bm.index] if active_vertex_bm else None # <bpy_struct, MeshVertex at 0x00000162CB465DA4> |
Активное ребро
Указатель на активное ребро мы можем получить точно так же, как и на активный вертекс. Через объект bmesh и историю выделения.
|
1 2 3 4 5 6 7 8 |
bm.edges.ensure_lookup_table() active_edge = None if bm.select_history: active_edge_bm = next((_edge for _edge in reversed(bm.select_history) \ if isinstance(_edge, bmesh.types.BMEdge)), None) active_edge = bpy.context.object.data.edges[active_edge_bm.index] if active_edge_bm else None # <bpy_struct, MeshEdge at 0x00000162CB185DF0> |
Таким образом мы получили все три нужных нам указателя – на активный вертекс, активное ребро и активную грань для текущего меша.

.blend file on Patreon