Для того, чтобы получить все полигоны, соседние с нужным, можно воспользоваться модулем bmesh, который предоставляет доступ ко всем данным меша в Blender.
Для начала импортируем модуль bmesh, и инициализируем интерфейс работы с данными для текущего активного меша при помощи метода from_edit_mesh.
Активный меш должен находиться в режиме редактирования.
1 2 3 4 5 |
import bpy import bmesh obj_data = bpy.context.object.data bm = bmesh.from_edit_mesh(obj_data) |
Получим текущий выделенный полигон, проверив свойство select у всех полигонов меша:
1 |
selected_face = next((face for face in bm.faces if face.select), None) |
Определим функцию, которая по переданному в нее полигону вернет список всех полигонов, которые с ним соседствуют.
1 2 3 4 5 |
def nearby_faces(face): faces = [] for vert in face.verts: faces.extend(vert.link_faces) return faces |
Мы пробежали циклом по всем точкам переданного полигона и получили все полигоны, которые имеют в своем составе эти точки.
Теперь мы можем вызвать нашу функцию, передав ей текущий выделенный полигон, и выделить все полигоны, которые она вернет.
1 2 3 4 |
faces_to_select = nearby_faces(selected_face) for face in faces_to_select: face.select = True |
Чтобы увидеть получившееся выделение, применим изменения к данным меша.
1 |
bmesh.update_edit_mesh(obj_data) |
Полный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import bpy import bmesh def nearby_faces(face): faces = [] for vert in face.verts: faces.extend(vert.link_faces) return faces obj_data = bpy.context.object.data bm = bmesh.from_edit_mesh(obj_data) selected_face = next((face for face in bm.faces if face.select), None) if selected_face: faces_to_select = nearby_faces(selected_face) for face in faces_to_select: face.select = True bmesh.update_edit_mesh(obj_data) |