Budżet: 5000 UAH Termin: 1 dzień
import bpy
import bmesh
import math
from mathutils import Vector
from collections import deque
# Istniejące funkcje tutaj...
def cut_mesh_along_loops(bm, loops):
"""
Tnie siatkę wzdłuż pętli granicznych (dziur) i tworzy nowe obiekty dla każdej części.
"""
# Upewnij się, że oryginalna siatka ma ściany
bm.faces.ensure_lookup_table()
# Tutaj przechowamy nowe obiekty
new_objects = []
# Krok 1: Przetwórz każdą pętlę i podziel geometrię wzdłuż dziury
for loop in loops:
# Zbierz krawędzie dziury
hole_edges = [e for e in loop]
# Krok 2: Usuń ściany, które przecinają dziurę
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
# Usuń ściany
for face in faces_to_remove:
bm.faces.remove(face)
# Krok 3: Utwórz nowe części siatki po przecięciu
new_bm = bmesh.new()
new_bm.from_mesh(bm)
# Teraz oddzielimy siatkę na podstawie cięcia
bmesh.ops.delete(new_bm, geom=faces_to_remove, context="FACES_ONLY")
# Utwórz nową siatkę dla oddzielonej części
new_mesh = bpy.data.meshes.new(f"Mesh_After_Cutting")
new_bm.to_mesh(new_mesh)
new_bm.free()
# Utwórz nowy obiekt i połącz z sceną
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():
"""
Główna funkcja do przetwarzania siatki zgodnie z określonymi krokami.
"""
# Pobierz aktywny obiekt
obj = bpy.context.active_object
if obj is None or obj.type != 'MESH':
print("Aktywny obiekt nie jest siatką.")
return
print(f"Przetwarzanie obiektu: {obj.name}")
mesh = obj.data
print(f"Wierzchołki: {len(mesh.vertices)}, Krawędzie: {len(mesh.edges)}, Ściany: {len(mesh.polygons)}")
# Upewnij się, że obiekt jest w trybie obiektu
if obj.mode != 'OBJECT':
bpy.ops.object.mode_set(mode='OBJECT')
print("Przełączono na tryb obiektu.")
# Utwórz kopię siatki, aby zachować oryginalny obiekt
bpy.ops.object.duplicate()
obj_copy = bpy.context.active_object
obj_copy.name = obj.name + "_Copy"
print(f"Utworzono kopię siatki: {obj_copy.name}")
# Znajdź dziury
bm = bmesh.new()