Для удаления у bmesh-объекта точек, ребер или полигонов удобнее всего использовать метод remove() для соответствующего набора элементов. Кроме того, для объекта bmesh предусмотрен оператор bmesh.ops.delete(), который позволяет удалять элементы меша с использованием разных режимов (контекста).
Для оператора удаления bmesh.ops.delete() предусмотрено семь контекстов:
- VERTS – удаление точек
- EDGES – удаление ребер
- FACES_ONLY – удаление только полигонов
- EDGES_FACES – удаление только ребер и полигонов
- FACES – удаление полигонов
- FACES_KEEP_BOUNDARY – удаление полигонов, с сохранением их границ
- TAGGED_ONLY – только отмеченные (не документировано)
Нужный контекст указывается в третьем параметре оператора delete().
Для примера добавим в сцену Сюзанну.
Для корректной работы с bmesh нужно переключиться в режим редактирования.
1 2 |
if bpy.context.active_object.mode == 'OBJECT': bpy.ops.object.mode_set(mode='EDIT') |
Создадим объект bmesh и перенесем в него данные с текущего активного меша (Сюзанны).
1 |
bm = bmesh.from_edit_mesh(bpy.context.object.data) |
Создадим список выделенных полигонов
1 |
selection = [face for face in bm.faces if face.select] |
Этот список передается во втором параметре оператора удаления. Если мы будем использовать контексты удаления для точек или ребер, список выделения нам нужно будет формировать соответственно из точек или ребер. При вызове оператора будут удалены только элементы из этого списка.
Выполним удаление
1 |
bmesh.ops.delete(bm, geom=selection, context='FACES_KEEP_BOUNDARY') |
В первом параметре оператора мы передали указатель на объект bmesh, во втором – созданный список выделения и в третьем – мы указали контекст.
При вызове оператора будут удалены выделенные полигоны, а так как использовался контекст удаления полигонов с сохранением их границ, то ребра вокруг удаленных полигонов не будут удаляться.
После выполнения удаления мы можем вернуть геометрию обратно в активный меш.
1 |
bmesh.update_edit_mesh(bpy.context.object.data) |