Для того чтобы полностью выделить или снять выделение со всего меша, мало изменить выделение только для его точек, нужно также изменить выделение и для ребер и для полигонов меша.
Однако в некоторых случаях у нас нет возможности управлять выделением ребер и граней меша, и мы можем устанавливать и снимать выделение только с его вертексов.
После того как мы изменили выделение для точек меша, мы можем “пересчитать” выделение, распространив его с точек на ребра и фейсы.
Для примера рассмотрим, как нам снять имеющееся выделение с текущего активного меша.
Создадим объект bmesh и перенесем в него активную геометрию. Заодно пересчитаем индексы вертексов меша, чтобы они соответствовали исходным.
1 2 3 4 |
import bmesh bm = bmesh.from_edit_mesh(bpy.context.object.data) bm.verts.ensure_lookup_table() |
Получить список текущих выделенных точек мы можем очень просто.
1 2 3 |
selected_vertiecs = [vert for vert in bm.verts if vert.select] # [<BMVert(0x00000221FB10F7C8), index=73>, <BMVert(0x00000221FB10F800), index=74>, ...] |
Если мы просто пройдем по списку и изменим для каждого вертекса его свойство выбора select на False,
1 2 |
for vert in selected_vertiecs: vert.select = False |
мы увидим, что выделение с точек снялось, однако оно осталось нетронутым на ребрах и полигонах меша.
Чтобы снять выделение полностью, мы можем в цикле выбирать linked-ребра и полигоны для нашего списка точек и тоже снять в них выделение, однако можно поступить проще.
Сначала переключим режим выделения в режим выделения точек – “VERTS”. А после снятия выделения с точек, вызовем функцию перерасчета выделения select_flush_mode(), чтобы оно изменилось для всей геометрии меша без исключений.
1 2 3 4 5 6 |
bm.select_mode = {'VERT'} for vert in selected_vertiecs: vert.select = False bm.select_flush_mode() |
Теперь мы видим, что выделение с нашего меша полностью снялось.
Точно так же можно действовать и при установке нужного выделения. Выделить нужные точки, а после этого сделать перерасчет выделения.
Например, выделим первые сто точек вместе с прилежащими к ним ребрами и полигонами.
1 2 3 4 |
for i in range(100): bm.verts[i].select = True bm.select_flush_mode() |
Как и при снятии выделения, благодаря использованию функции select_flush_mode() мы избавлены от необходимости отдельно искать и выделять ребра и полигоны меша, предназначенные для выделения.
Чтобы производимые нами действия отобразились на меше в сцене, не забудем вернуть изменения из bmesh в исходный меш, и очистить занимаемую им память.
1 2 |
bmesh.update_edit_mesh(bpy.context.object.data) bm.free() |