# -*- coding: utf-8 -*- """P04 肩叉:J1 从动杯体、M2 前端压盖、立柱 U 形减重槽、Hermite 弧面前脸。""" from arm.cad import arm_build as AB import cadquery as cq import math from arm.cad.helpers import cyl from arm.cad.arm_build import COVER_Z, Ycyl, bx from arm.kinematics import X_ARM, X_FORK_GAP, Y_AXIS, Y_COVER, Y_REAR, Z_RL, Z_SH from OCP.BRepAlgoAPI import BRepAlgoAPI_Common from arm.cad.part_tools import (Xplate, clamp_hole_drills, cut_motor_fence, hollow_channel, hub_m2_holes, make_surface_tie_bridge, motor_front_clamp) # 三处减重腔的开度。这三个件都是绕 Y 轴弯,弯矩在 X 方向拉压,距中性面越远的料 # 贡献越大,所以"少挖、挖窄"是恢复强度最省料的做法。 # 数值由 scratch/tune_hollow.py 按"槽区最差安全系数 >= 无槽基线的 95%"扫出来: # P04 档1 X23..35 Y102..154 Z>=525 -> 95% 基线,保留 69% 的减重量 # P07 档1 X−3..43 Y103..153 Z>=255 -> 96% 基线,保留 76% # P06 档1 抬高窗底到 Z362(不是收窄) -> 100% 基线,保留 56% # 窗底原来压在 Z358,而该处截面安全系数最低;抬高 4mm 比横向收窄 8mm 划算得多。 P04_CH = dict(x0=23.0, x1=35.0, y0=102.0, y1=154.0, z_floor=525.0) # 肩叉立柱 def p_fork(j1, j2): """P04_肩叉_螺旋体30%_墙5底5_竖打 (Shoulder Fork / L-Bracket) - 加长避让顺滑流线版: 1. 头部与身子起点自 X=5.5 前移加长至 X=10.5+X_FORK_GAP=11.5,叉板背面与 P03 托架端面 (X=8.5+X_BAY_EXT=11.5) 0.0 硬贴平(2026-10-02 用户两次要求"搞成平的"; P03 侧插槽独立加长 3mm 便于 M1 电机斜插卡入); 2. J1 从动法兰圆盘已删除(盘面在 column 前缘形成鼓楞):J1 由 boss(Ø35.6)贯通 P03 前盖中心孔直连电机输出盘;column 顶边保持 Z=646.5 与 P03 环齐高,R=18mm 大圆弧顺滑过渡; 3. 头部转接凸台加长贯通 P03 前盖中心孔 (R=19.5mm),直连 J1 旋转法兰盘; 4. M2 保留后端安装板(R=35mm, 带 rear_mount_holes 螺钉孔),前端定位环鼓出圆盘已删除(前端定位由 column 端面 pocket 承担),中间镂空散热; 4b. 【2026-10-02 新增】M2 前端压盖:原方案电机只被后端安装板(S02 4xM3x10)单面锁死, 大扭矩下电机绕 Y 轴在 Ø60.3 座孔里点头/翘起,固定不牢。现在前端盖外端面 (Y=156.0) 再加一枚同径 R35 压盖,用 4x M3x8 在电机前端盖 BCD55 上把电机 从前端夹一次 —— 电机被前后两块同心 Ø60.3 端面双向夹紧,倾斜自由度归零; 螺钉沉在压盖沉孔内不外凸,不占用 J2 轴向间隙(P05 法兰盘已相应后移); 5. 严格满足 single-solid 流形拓扑与 360° 全范围零干涉 (COLLISION pairs = 0)。 """ # 1. M2 后端安装法兰盘 (Y: 92..100, R=35mm) rear_plate = Ycyl(35.0, Y_REAR - 8.0, Y_REAR, X_ARM, Z_SH) # 2. M2 前端定位环 (Y: 149.5..155.5, R=35mm) front_collar = Ycyl(35.0, Y_COVER - 6.5, Y_COVER - 0.5, X_ARM, Z_SH) s = rear_plate.fuse(front_collar) # 2b. 【2026-10-02 新增】M2 前端压盖(几何与理由见 motor_front_clamp)。 # 必须在第 6/7 步所有 R30.15~30.5 圆柱刀具走完之后才熔接,否则压盖根部会被 # front_collar_pocket / c_m2 啃掉一圈 0.1mm 薄边(见 7b)。 fp = motor_front_clamp(X_ARM, Z_SH, tag="P04/M2") # 3. J1 从动法兰圆盘已删除:原 R=36.5 圆盘盘面在 column 前缘形成圆盘鼓楞, # J1 与 P04 的连接由 boss(Ø35.6 贯通 P03 前盖中心孔 R=19.5)直连电机输出盘 # 承担,螺钉走 boss 端面 4xB 孔,圆盘无传力功能已去除。 # 4. XZ 平面有机连续流线轮廓(随 X_FORK_GAP 整体前移,避让顺滑过渡): x_b, z_b = -12.65 + X_FORK_GAP, 506.0 x_a, z_a = 10.5 + X_FORK_GAP, 545.0 Lz = z_a - z_b d0 = 0.514 * Lz d1 = 0.0 hermite_pts = [] N_h = 16 for i in range(N_h + 1): t = i / N_h h00 = 2.0 * (t**3) - 3.0 * (t**2) + 1.0 h10 = t**3 - 2.0 * (t**2) + t h01 = -2.0 * (t**3) + 3.0 * (t**2) h11 = t**3 - t**2 xh = x_b * h00 + d0 * h10 + x_a * h01 + d1 * h11 zh = z_b + t * Lz hermite_pts.append((xh, zh)) # 顺滑过渡:从 (54.5, 525) 顺收到 (45.0, 555),两端切线均沿 +Z trans_pts = [] for i in range(1, 16): t = i / 16.0 h00 = 2.0 * (t**3) - 3.0 * (t**2) + 1.0 h10 = t**3 - 2.0 * (t**2) + t h01 = -2.0 * (t**3) + 3.0 * (t**2) h11 = t**3 - t**2 xt = 54.5 * h00 + 45.0 * h01 zt = 525.0 * h00 + 555.0 * h01 + 30.0 * (h10 + h11) trans_pts.append((xt, zt)) xz_wire = (cq.Workplane("XZ", origin=(0, Y_AXIS, 0)) .moveTo(10.5 + X_FORK_GAP, 545.0) .lineTo(10.5 + X_FORK_GAP, Z_RL + 36.5) .lineTo(28.0 + X_FORK_GAP, Z_RL + 36.5) .radiusArc((44.0 + X_FORK_GAP, 630.0), 18.0) .lineTo(44.0 + X_FORK_GAP, 555.0)) for pt in reversed(trans_pts): xz_wire = xz_wire.lineTo(pt[0], pt[1]) xz_wire = (xz_wire .lineTo(54.5, 525.0) .lineTo(54.5, 490.0) .lineTo(18.5 + X_FORK_GAP, 490.0) .lineTo(-17.0 + X_FORK_GAP, 490.0) .threePointArc((-16.0 + X_FORK_GAP, 498.5), (-12.65 + X_FORK_GAP, 506.0))) for pt in hermite_pts[1:]: xz_wire = xz_wire.lineTo(pt[0], pt[1]) xz_wire = xz_wire.close() xz_shape = cq.Shape(xz_wire.extrude(100.0, both=True).val().wrapped) # 5. YZ 平面包络 # 【2026-10-07 整改:M2耳板与立柱整体化,消除全部分界线与台阶】 # 原方案后法兰(Y92..100)与前端定位环/压盖(Y149.5..161)作为独立圆柱,与立柱的 # X向弧面轮廓不重合,导致交接处(Y=100, Y=149.5, Y=155.5)出现垂直切面分界台阶; # 前端压盖(Y155.5..161)上方更露出5.5mm悬空台阶。 # 现将立柱Y向基准延伸至整副叉架外缘(Y 92.0..161.0),在Z 490..525与前后耳板完全共面一体; # (161.0, 525)经光滑Hermite顺收到竖直前壁(164.5, 566),彻底消除全部竖向与横向分界线, # 前后耳板与立柱熔为单一坚固整体,抗弯扭刚度大幅提升。 y_front_clamp = 161.0 # 前端压盖外缘 Y_COVER+5.0,彻底消除压盖上方台阶 y_a = (y_front_clamp, Z_SH + 35.0) # (161.0, 525.0) 顺收终点 y_b = (Y_AXIS + 36.5, Z_RL + 36.5) # (164.5, 646.5) 顶面前沿 = 前壁所在 Y R_TIP = 3.0 # 顶面 -> 竖直前壁 的圆角半径 R_BACK = 3.0 # 顶面 -> 背面 的圆角半径(与前缘对称) Z_WALL_END = 566.0 # 竖直前壁落到此处,再往里顺收 _c = (y_b[0] - R_TIP, y_b[1] - R_TIP) # 前侧圆角心 (161.5, 643.5) _zb0, _zb1 = Z_RL + 36.5, Z_SH # 背面上下端 Z _yb0, _yb1 = Y_AXIS - 36.5, Y_REAR - 8.0 # 背面上下端 Y _z_ab = _zb0 - R_BACK # 弧与背面的切点高度 643.5 _y_ab = _yb0 + (_zb0 - _z_ab) / (_zb0 - _zb1) * (_yb1 - _yb0) _cb = (_y_ab + R_BACK, _z_ab) # 后侧圆角心 yz_pts = [(_cb[0], _zb0), # 顶面后缘改从圆角起点开始 (_c[0], y_b[1])] # 顶面走到前侧圆角起点 Y=161.5 for _k in range(1, 31): # R3 圆角:90° -> 0°,切线由水平转竖直 _a = math.radians(90.0 - 90.0 * _k / 30.0) yz_pts.append((_c[0] + R_TIP * math.cos(_a), _c[1] + R_TIP * math.sin(_a))) yz_pts.append((y_b[0], Z_WALL_END)) # 竖直前壁 Y=164.5 直落(直线段) _m = 0.5 * math.hypot(y_b[0] - y_a[0], Z_WALL_END - y_a[1]) * 0.5 for _k in range(1, 31): # 底部顺收 Hermite:两端切线都沿 -Z t = _k / 30.0 h00 = 2 * t ** 3 - 3 * t ** 2 + 1 h10 = t ** 3 - 2 * t ** 2 + t h01 = -2 * t ** 3 + 3 * t ** 2 h11 = t ** 3 - t ** 2 yz_pts.append((h00 * y_b[0] + h01 * y_a[0], h00 * Z_WALL_END + h01 * y_a[1] - _m * (h10 + h11))) yz_pts += [(y_front_clamp, Z_SH), (Y_REAR - 8.0, Z_SH), (Y_REAR - 8.0, Z_SH + 36.0)] for _k in range(0, 30): # 后侧 R3 圆角:180° -> 90° _a = math.radians(180.0 - 90.0 * _k / 30.0) yz_pts.append((_cb[0] + R_BACK * math.cos(_a), _cb[1] + R_BACK * math.sin(_a))) yz_solid = Xplate(yz_pts, -20.0, 70.0) c_int = BRepAlgoAPI_Common(yz_solid.wrapped, xz_shape.wrapped) c_int.Build() column = cq.Shape(c_int.Shape()) s = s.fuse(column) # 6. 中部电机定子散热切除 # 【2026-10-05f】这刀原本是独立存在的(挖 R30.5 让定子裸露)。现在主腔已经 # 统一到 BAY_R=30.50 并从承压面一路挖到前端,这刀完全落在主腔范围内 —— # 留着不改也不会多挖,但它是「同一段腔被两个不同半径各挖一次」的残留, # 正是接缝的来源,删掉以免后人以为散热口另有深意。 # 通风靠 cut_open(第 6b 步的敞口盒切)实现,不依赖这刀。 # s = s.cut(Ycyl(30.5, Y_REAR + 0.5, Y_COVER - 6.5, X_ARM, Z_SH)) # 7. M2 接口成型 # 【2026-10-05f】与 Joint.pocket 同步:主腔统一为单一 BAY_R 圆柱, # 从承压面一路挖到前端盖外,内壁不再有 R35/R30.15/R30.25/R30.50 四段台阶。 # (承压面段不再单独挖 SEAT_R:BAY_R 从 -REAR_SEAT 起就覆盖了它, # 承压面本身仍是 R35 外壁围出的完整平圆盘。) s = j2.rear_mount_holes(s, t_plate=8.0, hole_d=2.8, cb_d=5.5, cb_depth=4.0) s = s.cut(j2.L(cyl(AB.BAY_R, -AB.REAR_SEAT, COVER_Z + 0.6))) # 【2026-10-07 修复:仅切除敞口侧承压面环墙,杜绝立柱切穿空隙】 # 仿照 P05 大臂旋转座设计,只在敞口半侧(局部 y>=0)将承压面段(z: -REAR_SEAT..0)切平, # 彻底消除阻碍电机装配的凸起围挡;立柱背脊侧(局部 y<0)绝对不动,杜绝切穿立柱留下空隙! s = s.cut(j2.L(bx(-40.0, 40.0, 0.0, 40.0, -AB.REAR_SEAT, 0.0))) # 7b. M2 前端压盖熔接(见 2b):必须在 6/7 步所有 R30.15~30.5 圆柱刀具走完之后, # 否则压盖根部会被 front_collar_pocket / c_m2 啃掉一圈 0.1mm 薄边。 s = s.fuse(fp) # 7b1.【2026-10-10 修复】压盖熔接后对最终并集重钻 4xM3x8,找回被立柱填平的沉孔。 # 第 5 步「M2 耳板与立柱整体化」把立柱扩到 Y 92..161 / Z 490..525,正好盖住 # 压盖上半侧(+Z)两个沉孔方位(@17.8° 与 @107.8°,R27.5)。fp 上的孔是**预钻** # 的,fuse 取并集不会挖掉本体那部分料,于是并集上这两孔被填回实心 # (实测沉孔段 r3.0×3.0 与 P04 STEP 交集 84.82 mm³ = 参考体积 84.8 mm³ 的 100%, # 通孔段也被堵掉 47%);下半侧两孔在 Z<490 立柱范围外,所以只剩 2 个孔能用。 # 与下方重钻 Ø37 中心孔那一刀同源:本体有料占住的孔,只能在熔接之后重钻。 s = s.cut(clamp_hole_drills(X_ARM, Z_SH)) # 7b2.【2026-10-05e / 2026-10-07 修复】删掉前端"围挡"在敞口侧的那半圈环墙(见 FENCE_OPEN_CUT)。 # 参考 P05 大臂旋转座设计,两端均无围挡阻碍,电机可顺畅装配入座。 s = cut_motor_fence(s, j2, "P04/M2", "P04") # 贯通前端压盖 Ø37 (R=18.5) 让位孔,给 P05 J2 直锁从动凸台 (R=17.8) 留出充裕动间隙 s = s.cut(Ycyl(18.5, Y_COVER - 1.0, 162.0, X_ARM, Z_SH)) # 7c. 【2026-10-02 新增】立柱减重槽(见 hollow_channel)。 # 立柱 Z525..635 整段是壁厚最深处达 17.5mm 的实心料,而 J2 在 z=560/600 的 # 安全系数有 19。挖成朝上敞开的 U 形槽后立柱变成槽钢:抗弯的两片 X 向腹板 # 正好落在弯矩拉压区(z=560 截面 X13..45,中性面在 X29,腹板占 X13~23/X35~45), # 被掏掉的正是中性层附近几乎不参与抗弯的料。 # 槽底 Z525 以下保留整块实心过渡到电机座;顶部敞开故非封闭腔、免支撑。 # 必须在 8 步 J1 凸台/螺钉孔之前切:槽的 X23..35 范围离 J1 凸台(X<=11.5)与 # 3xS01 沉孔(X12..14)都有富余,但先切可以保证后面那些刀具不会把槽壁打薄。 # 7c2.【2026-10-05 槽右壁跟随外轮廓,去掉右上角两段尖楔】 # x1=35 是按立柱中段定的(Z525~630,X11.5~45 全宽都在,中性面 X29, # 两片腹板 X13~23 / X35~45 各 10mm)。可 Z630 以上零件被 R18 圆角收窄: # 顶面只剩 X11.5~29,再往右是圆角带 X29~45。 # 原先一刀切到底,槽就横着切进圆角带;又因为槽在 Y=102/154 收尾, # 圆角带被切成两段悬空的楔料(一头尖一头宽),从右上角看就是"一小段尖的" # —— 它悬在槽口上方 1.7mm(Z644.76~646.5)没有支撑,尖头正好落在收尾处。 # 改法:**上段跟着外轮廓收窄**,Z>630 只切到 X29(顶面右边缘), # 圆角带 X29~45 一整条保持连续,中/左/右三段料都不再悬空, # 尖楔和新台阶一起消失(先前只在 Z644.8 削平顶面,等于把尖顶削成一条 # 新台阶,尖头本身还在,更难看 —— 已回退)。 # 下段 X23..35 原样保留,腹板位置和厚度都不动,强度结论不受影响。 # 分界 Z=630 取自 xz_wire:R18 圆弧正是从 (X45,Z630) 起往左上收。 Z_TAPER = 630.0 # = 圆角起点 Z,槽右壁在此处收窄 X_TOP_EDGE = 29.0 # = 顶面右边缘(圆角带上沿),槽不许越过 s = s.cut(hollow_channel(P04_CH["x0"], P04_CH["x1"], P04_CH["y0"], P04_CH["y1"], P04_CH["z_floor"], Z_TAPER, tag="P04立柱下段")) s = s.cut(hollow_channel(P04_CH["x0"], X_TOP_EDGE, P04_CH["y0"], P04_CH["y1"], Z_TAPER, 660.0, tag="P04立柱上段(随外轮廓收窄)", fil=0.0)) # 上段 fil=0:槽宽只剩 6mm(X23~29),R4 内角圆角在 6mm 宽的槽上两侧 # 叠加会退化成零面积而失败(实测报 BRep_API: command not done)。 # 8. 头部转接凸台加长(贯通 P03 前盖中心孔,跨越装配缝直连 J1 输出盘) boss = cyl(17.8, 54.942, 61.5 + X_FORK_GAP) s = s.fuse(j1.L(boss)) s = s.cut(j1.L(cyl(3.5, 54.0, 74.0 + 30.0))) # 沉孔台阶固定在 63.0(不随前移):M2x10 旋入电机输出毂的咬合量与改前一致; s = hub_m2_holes(s, j1, cb_z1=74.0 + 40.0 + X_FORK_GAP, th_z1=63.0 + X_FORK_GAP, cb_z0=63.0) # 9. 实体表面外凸式扎带拱桥 (3组 10x8mm 拱形穿带座,一体成型,完全在外部穿扎带): # 组①:立柱顶端接缝入口 (X=20.0, Z=615.0,动静接缝后锚固点,水平穿带) # 组②:立柱中部垂直顺行段 (X=20.0, Z=560.0,水平穿带) # 组③:立柱下部入电机前段 (X=20.0, Z=515.0,水平穿带,避开后盖螺钉) for tz in (615.0, 560.0, 515.0): b = make_surface_tie_bridge(20.0, Y_REAR - 8.0, tz, w_x=10.0, l_z=8.0, h_y=3.2, slot_w=3.2, slot_h=1.8, tunnel_dir='X') s = s.fuse(b) return s JOINT = 'J1' def specs(JS): """本件的 (件号, 中文名, 构建 thunk, 配色, 说明) 清单;顺序即 BOM 顺序。""" j1 = JS["J1"] j2 = JS["J2"] return [ ("P04_肩叉_螺旋体30%_墙5底5_竖打", "肩叉", lambda: p_fork(j1, j2), 0x2563eb, "齐平插槽+ M2 前端压盖+ 立柱减重槽版:叉板背面与P03托架端面(11.5)0.0硬贴平(用户要求外观齐平),P03侧插槽独立加长3mm,M1电机可倾斜卡入,J1输出凸台贯通直连电机,J1从动法兰圆盘鼓楞已删(接缝区与P03止脱环齐径齐高R36.5/顶646.5),单实体全角度零干涉;【2026-10-07 J1 直锁孔与垂直姿态校准】J1 转子 3xM2 沉孔消除 (360-a) 镜像翻转,采用真实转子孔位 m2_clock=(8.05, 128.07, 248.06) 随 J1 坐标系同步旋转 5.35°,在零位保证手臂竖直下垂的同时螺钉精准拧入 M1 输出转子,彻底解决装配倾斜问题;【2026-10-02】M2 前端压盖(R35, Y155.5..161.0):电机前端盖外端面加 4xM3x8 沉孔(BCD55)夹紧,与后端安装板 4xM3x10 形成前后双向面压,消除大扭矩下电机在座孔里的倾斜;【2026-10-02】立柱减重槽(X23~35 / Y102~154 / 自Z525向上敞开):立柱Z525~635整段壁厚峰值17.5mm,J2在z=560/600的安全系数有19,改成U形槽钢后361->289cm3(-20%),抗弯的两片X向腹板正好落在弯矩拉压区(z=560截面X13~45、中性面X29,腹板占X13~23/X35~45),掏掉的正是中性层附近几乎不参与抗弯的料;槽底Z525以下保留整块实心过渡到电机座,槽底水平朝上、侧壁竖直、顶部敞开故零支撑且非封闭腔;开度按「减重区最差安全系数 >= 无槽基线 95%」选定(X23~35 比最初的 X21~37 收窄 2mm,强度从 88% 回到 95%);【2026-10-04 视觉整改】电机上方那块 4048mm2 的大平面改成 Hermite 弧面(全行程重扫 907s 确认 J1~J6 行程逐项不变):原来 yz_pts 里(164.5,646.5)->(155.5,526) 是一条直线,沿 X 拉成 4048mm2 平板(法向 (0,1,-0.07)、带 4° 斜度),正对电机上方,两侧被 xz_wire 的 R18 圆弧挤出去,形成「中间一块平、两边鼓」的观感。改成三次 Hermite(两端切线分别沿 Y/Z,与上下水平段 G1 连续),中部向 +Y 外凸约 3mm,弧度与两侧 R18 一致;单段圆弧无法同时满足两端切线(解出 R=9 与 R=120.5 矛盾)故用 Hermite。P04 体积 282.1->274.3cm³(弧面替代平面削掉的料);【2026-10-05 承压面让位腔改为 R35 圆腔、凸台与围挡一并消除】电机尾端垫片位(REAR_SEAT=2.6)用圆腔掏出承压面。**刀半径必须等于外壁 R35**(arm_build.SEAT_R):取小于 R35(曾试 32.2 = 64.4 方腔内切圆)时,刀半径与外壁之间那圈 2.8mm 环墙完整保留,而承压面只挖到刀半径,于是该环墙相对承压面【凸起】并把电机尾端面围住 —— 这就是用户截图里的一圈围挡(P08 实测 1536.9mm3)。它不是残留,而是 SEAT_R+1.0 杯体连接,无整圈通槽)。沉孔 z 区间(-8..-4)与圆腔(-2.6..+1.0)不重叠,S02 完好。连带:承压环由「方腔内切 32.2 − 沉孔外缘 30.25 = 1.95mm 窄环」变为「完整 R35 圆环 4.75mm」,受压面积 383->974mm²(2.5 倍)。【2026-10-04 承压面让位腔改为 32.2 圆腔】电机尾端垫片位(REAR_SEAT=2.6)之前用 64.4 **方**腔掏出来,方腔壁以外 z=-2.6..0 那圈料相对新承压面凸起 2.6mm,打印时是悬空薄壁(用户反馈:难打印、需支撑、公差差)。现承压面段改用**SEAT_R=32.2 圆腔**(= 64.4 方腔的内切圆半径,z=-2.6..0 与方腔平接)把整圈挖到承压面高度,凸台零残留;z=0 以上 PCBA 腔仍保持 64.4 方(PCB 是方的必须方腔)。**关键:刀半径必须取 32.2 而不是 R35** —— 中间试过 R35,结果把 r=32.2..35 的连接壁整圈切断:实测 P04 在 z=-2.6..+1.0 只剩 240~320° 方位有料,其余 360° 全掏空,后端法兰与杯壁之间出现 3.6mm 宽通槽 + 225° 一片 0.5mm 孤立薄片(用户截图:肩叉顶部「没连上」)。取 32.2 后 r=32.2..35 这圈 2.8mm 厚壁完整保留,360° 连续,既无凸台又与上方臂身连成一体(实测 5/5 件连接壁整圈连续、单实体);【2026-10-10 修复 M2 前端压盖丢失的 2 个沉孔】第 5 步「M2 耳板与立柱整体化」把立柱扩到 Y92..161 / Z490..525,正好盖住压盖上半侧(+Z)两个沉孔方位(BCD55 @17.8°、@107.8°),而压盖的孔是在熔接**之前**预钻的,fuse 取并集不会挖掉本体那部分料,于是并集上这两孔被填回实心 —— 4xM3x8 前端夹紧实际只剩 2 个孔可用(实测沉孔段 r3.0×3.0 与 P04 交集 84.82 mm³ = 满料参考值 84.82 mm³ 的 100%,通孔段也被堵 47%;下半侧 @197.8/@287.8 在 Z<490 立柱范围外故完好)。修法 = 熔接后对最终并集重钻一次(part_tools.clamp_hole_drills,与压盖同一孔位事实源;与既有的「熔接后重钻 Ø37 中心孔」同源)。复核三判据全过:布尔交集 4/4 = 0.00 mm³、剖面孔腔占比 4/4 = 100%(切面 Y159.5 空腔角度簇 = 17.8/107.8/197.8/287.8)、Ø5.5×3 螺钉头 + Ø3.0×8 螺杆与 P04 重叠 4/4 = 0.000 mm³;P04 体积 326.1→325.9 cm³,单实体 ✓,静态干涉 0 对 ✓,全机 20 个压盖孔 20/20 OK"), ]