Бюджет: 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()