# -*- coding: utf-8 -*- u"""派生 v11(2026-09-30 用户实测:两个 Type-C 口墙太厚,线插不到底): topshell_v10 → topshell_v11:南墙两个 Type-C 贯穿孔仍 = 母座口内侧轮廓 8.34×2.60 R0.7, 外侧加 PK_W × PK_H、R PK_R 的沉槽,槽底留 PK_LEFT 薄壁(用户:不要完全掏空,留 1 mm); 中心不变 J1 x12.5 / J23 x84、z −1.65;标识右移到 SYM_DX。 place_v10 → place_v11、export_stl_v10 → export_stl_v11:只换顶盖件名。 底盖 BottomPlate_v6 不变。纯文本补丁,锚点断言次数。 为什么是护套尺寸:母座口面 y=0.20,墙外表面 y=−4.055 ⇒ 口缩在墙里 4.26;开口只有口那么大时 只有插头金属壳能进墙,要金属壳 ≳ 4.26 + 口深 4.05 ≈ 8.3 才插得到底,常见线约 6.5(R2 规划 §外壳 v4 的已知风险)。 沉槽让护套伸进墙 PK_D = 2.4 − 1.0 = 1.4 ⇒ 护套前端到口面 4.26 − 1.4 = 2.86,金属壳要 ≳ 2.86 + 4.05 ≈ 6.9(原 8.3)。 常见 USB-C 线护套 12×6.5 左右,编织 / 加粗线可到 13×7 ⇒ 槽取 13.4 × 7.4 留余量。""" import io import os import sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', write_through=True) T = os.path.dirname(os.path.abspath(__file__)) + os.sep PK_W, PK_H, PK_R = 13.4, 7.4, 3.2 # 外侧沉槽(护套能进);R 取 3.2 是为了和已有的圆柱面半径都不撞,直方图才验得出 PK_LEFT = 1.0 # 槽底留的薄壁(用户 2026-09-30:不要完全掏空,留 1 mm) SYM_DX = 10.5 # 标识中心离口中心;箭头半宽 2.2 ⇒ 左缘 8.3,离沉槽边 6.7 还剩 1.6 的墙 def patch(src, dst, pairs, head): s = open(T + src, encoding='utf-8').read() for old, new, n in pairs: c = s.count(old) if c != n: raise SystemExit(u'%s:锚点 %r 出现 %d 次(期望 %d)' % (src, old[:70], c, n)) s = s.replace(old, new) s = s.replace(u'# -*- coding: utf-8 -*-\n', u'# -*- coding: utf-8 -*-\n# ' + head + u'\n', 1) open(T + dst, 'w', encoding='utf-8').write(s) print(u'写出', dst) POCKET = u""" # ── [5a] v11:Type-C 外侧沉槽 —— 护套进墙、槽底留 PK_LEFT 薄壁;贯穿的仍是上面那个母座口小孔 ── WALL_T = IY0 - Y0 # 南墙厚 2.4 PK_W, PK_H, PK_R, PK_LEFT = %.2f, %.2f, %.2f, %.2f PK_D = WALL_T - PK_LEFT A_PORT = USB_W * USB_H - (4 - math.pi) * USB_R ** 2 A_PK = PK_W * PK_H - (4 - math.pi) * PK_R ** 2 P(u'\\n[5a] 南墙 Type-C 沉槽 ×2:%%.2f × %%.2f、R%%.2f,深 %%.2f(墙 %%.2f,留 %%.2f)' %% (PK_W, PK_H, PK_R, PK_D, WALL_T, PK_LEFT)) _port = (USB_W, USB_H, USB_R) USB_W, USB_H, USB_R = PK_W, PK_H, PK_R # usb_shapes 读全局;画完就还原 nbefore = len(faces()) X = open_face_sketch((1, -1, Y0), u'南墙沉槽') sm.AddToDB = True nseg = 0 for cx in USB_CX: lines, arcs = usb_shapes(cx) for p0, p1 in lines: q0, q1 = to_sketch(X, (p0[0], Y0, p0[1])), to_sketch(X, (p1[0], Y0, p1[1])) nseg += bool(sm.CreateLine(q0[0], q0[1], 0.0, q1[0], q1[1], 0.0)) for c, p1, p2 in arcs: qc = to_sketch(X, (c[0], Y0, c[1])) q1 = to_sketch(X, (p1[0], Y0, p1[1])) q2 = to_sketch(X, (p2[0], Y0, p2[1])) cross = (q1[0] - qc[0]) * (q2[1] - qc[1]) - (q1[1] - qc[1]) * (q2[0] - qc[0]) nseg += bool(sm.CreateArc(qc[0], qc[1], 0.0, q1[0], q1[1], 0.0, q2[0], q2[1], 0.0, 1 if cross > 0 else -1)) sm.AddToDB = False sm.InsertSketch(True) USB_W, USB_H, USB_R = _port if nseg != 16 or pick(last_sketch(), 'SKETCH') != 1: P(u' ⛔ 沉槽草图不对(段 %%d)' %% nseg); sys.exit(5) c = fm.FeatureCut4(True, False, False, 0, 0, M(PK_D), 0.0, False, False, False, False, 0.0, 0.0, False, False, False, False, False, True, True, False, False, False, 0, 0.0, False, False) floor = sum(a_ for ax_, sg, fb, a_, _ in planes() if ax_ == 1 and sg == -1 and abs(fb[1] - (Y0 + PK_D)) < 0.02 and abs(fb[4] - (Y0 + PK_D)) < 0.02) want = 2 * (A_PK - A_PORT) ok = abs(floor - want) < 0.05 P(u' 沉槽 切除 → %%-12r 面数 %%d→%%d 槽底薄壁面积 %%.3f(理论 2×(%%.3f−%%.3f) = %%.3f)%%s' %% (prop(c, 'Name') if c else c, nbefore, len(faces()), floor, A_PK, A_PORT, want, u'✅' if ok else u'⛔')) if not ok: P(u' ⛔⛔ 沉槽深度 / 轮廓不对,停手、不存盘'); sys.exit(5) """ % (PK_W, PK_H, PK_R, PK_LEFT) patch('topshell_v10.py', 'topshell_v11.py', [ (u"TopShell_v10.SLDPRT'", u"TopShell_v11.SLDPRT'", 1), (u"'TOPSHELL_V10'", u"'TOPSHELL_V11'", 1), (u"# ── [5b] F:Type-C 右侧", POCKET.lstrip('\n') + u"# ── [5b] F:Type-C 右侧", 1), (u"SYM_DEPTH, SYM_DX = 0.6, 9.0", u"SYM_DEPTH, SYM_DX = 0.6, %.1f # v11:随沉槽右移" % SYM_DX, 1), (u"WANT_H = {0.7: 8, 0.75: 2 * SLOT_N,", u"WANT_H = {0.7: 8, %.1f: 8, 0.75: 2 * SLOT_N," % PK_R, 1), ], u'v11:南墙 Type-C 外侧沉槽 %.1f×%.1f R%.1f、槽底留 %.1f 薄壁(小孔仍 = 母座口),标识右移到 %.1f;其余同 v10' % (PK_W, PK_H, PK_R, PK_LEFT, SYM_DX)) patch('place_v10.py', 'place_v11.py', [ (u"(u'TopShell_v10.SLDPRT',", u"(u'TopShell_v11.SLDPRT',", 1), (u"OUT = r'C:\\Users\\35138\\.claude\\jobs\\11836093\\tmp'", u"OUT = os.path.join(os.environ['TEMP'], 'phonerail_shell')\nos.makedirs(OUT, exist_ok=True)", 1), (u"((u'v10_iso', 7), (u'v10_bottom', 2))", u"((u'v11_iso', 7), (u'v11_bottom', 2))", 1), ], u'v11:总装换 TopShell_v11(Type-C 外侧沉槽、留 1 mm 薄壁),底盖仍 BottomPlate_v6') patch('export_stl_v10.py', 'export_stl_v11.py', [ (u"PARTS = [(u'TopShell_v10', True), (u'BottomPlate_v6', False)]", u"PARTS = [(u'TopShell_v11', True), (u'BottomPlate_v6', False)]", 1), ], u'v11:导出 TopShell_v11(Type-C 开口放大)+ BottomPlate_v6')