Бюджет: 5000 UAH Срок: 1 день
import bpy
import bmesh
import math
from mathutils import Vector
from collections import deque
# Существующие функции здесь...
def cut_mesh_along_loops(bm, loops):
"""
Разрезает сетку вдоль границ петель (дыр) и создает новые объекты для каждой части.
"""
# Убедитесь, что у оригинальной сетки есть грани
bm.faces.ensure_lookup_table()
# Мы будем хранить новые объекты здесь
new_objects = []
# Шаг 1: Обработать каждую петлю и разделить геометрию вдоль дыры
for loop in loops:
# Собрать ребра дыры
hole_edges = [e for e in loop]
# Шаг 2: Удалить грани, которые пересекаются с дырой
faces_to_remove = []
for face in bm.faces:
for edge in hole_edges:
if any(e in face.edges for e in hole_edges):
faces_to_remove.append(face)
break
# Удалить грани
for face in faces_to_remove:
bm.faces.remove(face)
# Шаг 3: Создать новые части сетки после разрезания
new_bm = bmesh.new()
new_bm.from_mesh(bm)
# Теперь мы разделим сетку на основе разреза
bmesh.ops.delete(new_bm, geom=faces_to_remove, context="FACES_ONLY")
# Создать новую сетку для разделенной части
new_mesh = bpy.data.meshes.new(f"Mesh_After_Cutting")
new_bm.to_mesh(new_mesh)
new_bm.free()
# Создать новый объект и связать его со сценой
new_obj = bpy.data.objects.new(new_mesh.name, new_mesh)
bpy.context.collection.objects.link(new_obj)
new_objects.append(new_obj)
return new_objects
def process_mesh():
"""
Основная функция для обработки сетки в соответствии с определенными шагами.
"""
# Получить активный объект
obj = bpy.context.active_object
if obj is None or obj.type != 'MESH':
print("Активный объект не является сеткой.")
return
print(f"Обработка объекта: {obj.name}")
mesh = obj.data
print(f"Вершины: {len(mesh.vertices)}, Ребра: {len(mesh.edges)}, Грани: {len(mesh.polygons)}")
# Убедитесь, что объект в режиме объекта
if obj.mode != 'OBJECT':
bpy.ops.object.mode_set(mode='OBJECT')
print("Переключено в режим объекта.")
# Создать копию сетки, чтобы сохранить оригинальный объект
bpy.ops.object.duplicate()
obj_copy = bpy.context.active_object
obj_copy.name = obj.name + "_Copy"
print(f"Создана копия сетки: {obj_copy.name}")
# Найти дыры
bm = bmesh.new()