exec(open(r"D:\HADAL - The Descent\models\dnr-cnc\build\lib2.py").read()) root = bpy.data.objects["DNR_CNC_Root"] C_MOVE = get_coll("CNC_Moving") if "SM_DNR_Door" in bpy.data.objects: bpy.data.objects.remove(bpy.data.objects["SM_DNR_Door"]) ti, bz, gl = MAT("Titanium"), MAT("Bezel_Black"), MAT("Glass") rd, cy, bd = MAT("Glow_Red"), MAT("Glow_Cyan"), MAT("Body_Dark") door = MB("SM_DNR_Door", [ti, bz, gl, rd, cy, bd]) I_TI, I_BZ, I_GL, I_RD, I_CY, I_BD = [door.mi(m) for m in (ti, bz, gl, rd, cy, bd)] # door-local profile (u = across, v = up). front face at y = 0, thickness along +Y. O = [(-0.60, 0.00), (0.60, 0.00), (0.765, 0.20), (0.765, 1.80), (0.70, 1.94), (0.55, 1.94), (0.46, 1.85), (-0.46, 1.85), (-0.55, 1.94), (-0.70, 1.94), (-0.765, 1.80), (-0.765, 0.20)] I = [(-0.42, 0.58), (0.42, 0.58), (0.54, 0.70), (0.54, 1.62), (0.54, 1.70), (0.48, 1.76), (0.44, 1.76), (-0.44, 1.76), (-0.48, 1.76), (-0.54, 1.70), (-0.54, 1.62), (-0.54, 0.70)] G = [(-0.36, 0.66), (0.36, 0.66), (0.47, 0.77), (0.47, 1.60), (0.47, 1.64), (0.43, 1.69), (0.40, 1.69), (-0.40, 1.69), (-0.43, 1.69), (-0.47, 1.64), (-0.47, 1.60), (-0.47, 0.77)] N = len(O) T_OUT, T_IN = 0.10, 0.05 bm = bmesh.new() def loop(pts, y): return [bm.verts.new((u, y, v)) for (u, v) in pts] Lo, Li, Lg = loop(O, 0.0), loop(I, 0.0), loop(G, T_IN) Lob, Lib = loop(O, T_OUT), loop(I, T_IN) def F(vs, mi): f = bm.faces.new(vs) f.material_index = mi return f front = [] for i in range(N): j = (i + 1) % N front.append(F((Lo[i], Lo[j], Li[j], Li[i]), I_TI)) # silver front strip (faces -Y) F((Lo[j], Lo[i], Lob[i], Lob[j]), I_TI) # outer wall (back is open) F((Li[i], Li[j], Lib[j], Lib[i]), I_CY) # inner reveal: glowing cyan edge F((Lib[i], Lib[j], Lg[j], Lg[i]), I_BZ) # black bezel tray bm.normal_update() # glass: the 12-gon loop tiled by 3 quads + 1 flat hexagon (collinear top vertices) (a ladder, no interior vertices) glass_faces = [] for idx in ((0, 1, 2, 11), (11, 2, 3, 10), (10, 3, 4, 9), (9, 4, 5, 6, 7, 8)): glass_faces.append(F([Lg[i] for i in idx], I_GL)) bm.normal_update() n_glass = len(glass_faces) # chin vent: inset the chin strip quad, reshape it into a trapezoid and sink it chin = front[0] res = bmesh.ops.inset_individual(bm, faces=[chin], thickness=0.07, use_even_offset=True) inner_vs = list(chin.verts) # order the 4 verts: bottom-left, bottom-right, top-right, top-left inner_vs.sort(key=lambda v: (round(v.co.z, 3), v.co.x)) bl, br = sorted(inner_vs[:2], key=lambda v: v.co.x) tl, tr = sorted(inner_vs[2:], key=lambda v: v.co.x) bl.co.x, bl.co.z = -0.30, 0.14 br.co.x, br.co.z = 0.30, 0.14 tl.co.x, tl.co.z = -0.20, 0.36 tr.co.x, tr.co.z = 0.20, 0.36 for v in inner_vs: v.co.y += 0.035 chin.material_index = I_BD bm.normal_update() # bevel the front outline (outer + inner front edges) for a machined edge highlight edges = [] for i in range(N): j = (i + 1) % N for a, b in ((Lo[i], Lo[j]), (Li[i], Li[j])): e = bm.edges.get((a, b)) if e: edges.append(e) bevel_edges(bm, edges, 0.010, 2) bm.normal_update() door.add_bm(bm, None) # red glowing slats on both pillars (slightly proud of the silver, back face dropped) for sx in (-1, 1): for k in range(8): v = 0.88 + k * 0.095 door.box((0.075, 0.012, 0.068), (sx * 0.665, -0.006, v), rd, bevel=0.004, drop=('+y',)) # small cyan status pip on the top bar door.box((0.30, 0.010, 0.012), (0.0, -0.005, 1.805), cy, drop=('+y',)) o_door = door.build(C_MOVE, loc=(0.29, -1.51, 0.43), parent=root, recalc=False) result = {"glass_faces": n_glass, "audit": audit(o_door), "bbox": [round(c, 3) for v in (o_door.bound_box[0], o_door.bound_box[6]) for c in v]}