R2:底板 / 刀片布局布线脚本、快照、截图与规划文档更新(含外壳、打印件、布线归档)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-10-04 19:24:45 +08:00
共同撰写人 Claude Opus 5.5
父节点 cd01640c40
当前提交 cf7cc9cf90
共修改 759 个文件,包含 76962 行新增和 5299 行删除
+101
查看文件
@@ -0,0 +1,101 @@
# -*- 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')