Точно так же как и в стандартной структуре данных меша, в объекте bmesh присутствует понятие текущего “активного” вертекса. Мы можем узнать, какой вертекс считается в bmesh в текущий момент активным, а также назначить активный вертекс в bmesh при помощи Blender Python API.
Для начала создадим объект bmesh и загрузим в него данные из текущего активного меша.
Меш должен находиться в режиме редактирования (EDIT mode).
1 2 3 |
mesh = bpy.context.object.data bm = bmesh.from_edit_mesh(mesh) bm.verts.ensure_lookup_table() |
Заодно выполним операцию ensure_lookup_table для вертексов, чтобы привести их индексы к тому же порядку, что и в исходном меше.
В объекте bmesh есть так называемая “история” выделений, в которой хранятся все выделенные вертексы. Последний выделенный вертекс, который соответственно записан в списке истории на последнем месте, считается для bmesh активным.
Чтобы узнать, какой вертекс является активным в настоящий момент, нам нужно просто вывести значение свойства active в истории:
1 2 3 |
print(bm.select_history.active) # <BMVert(0x0000022DF60598A8), index=357> |
Для того чтобы назначить активным другой, нужный нам, вертекс, нужно просто добавить его в историю выделений bmesh командой add().
1 2 |
bm.select_history.remove(bm.verts[301]) bm.select_history.add(bm.verts[301]) |
Если вертекс уже присутствует в истории выделения, повторное добавление его в историю не будет иметь эффекта. Поэтому чтобы гарантированно добавить его на последнее место в истории (и сделать активным) предварительно его нужно из истории удалить командой remove().
Если мы теперь выведем на печать текущий активный вертекс, мы увидим нужный нам результат.
1 2 3 |
print(bm.select_history.active) # <BMVert(0x0000022DF60598A8), index=301> |
При необходимости мы можем сбросить данные из bmesh обратно в основной меш и освободить объект bmesh.
1 2 |
bmesh.update_edit_mesh(mesh) bm.free() |