Files
Robot_Arm/arm/cad/parts/p04_fork.py
T
cbb 649bd69810 refactor(layout): src/ 收成顶层包 arm/,入口统一 python -m;提升承担构建的 scratch 脚本
单文件约束取消后,Python 侧没必要再靠 16 处 sys.path.insert 维持扁平模块互认。
现在按职责分包:
  arm/paths.py 路径唯一来源(含新增 CACHE、TPL)
  arm/constants.py 实测接口数值(原 armcore 的 M/C/CLR/FIT/MOTOR_TOL 段)
  arm/cad/{helpers,arm_build,part_tools,parts/} 几何与装配
  arm/kinematics.py(原 human_layout.py,唯一运动学事实源)
  arm/analysis/{sweep_v2,strength_check,torque_balance,finalize_travel,ws_sweep,gen_env_mesh}
  arm/dataio/{screw_mesh,draw_sheet}   arm/viewer/{build_viewer,shot}
  arm/build_model.py(原 arm_model.py)

顺带修掉的既有缺陷(都是实测撞出来的,不是预防性改动):
- arm_model 第二次 sys.path 跳到 gitignore 的 scratch/ 去 import 构建必需的包络脚本:
  ws_sweep/gen_env_mesh 提升进 arm/analysis/,缓存挪到 data/cache/(gitignore,可重生成)。
- finalize_travel / draw_sheet 顶层就是"算完写文件",一次 importlib 冒烟测试就把
  docs/travel.json 重写了一遍;现在被 import 直接抛错。
- strength_check 用 OUT.replace("/out","/web") 靠字符串形状推路径,改成直接用 WEB。
- build_viewer 里 WORKSPACE 使用点漏改导致 NameError —— 已由构建关卡抓到并修掉。

os._exit 的处置与计划里的假设相反:实测光是 `python -c "import arm.cad.helpers"`
就会在解释器退出时段错误(exit 139,OCC 静态析构),全流程跑完也一样。所以入口
脚本尾部保留 flush + os._exit,并把原因写进注释;被 import 时不生效。

关卡(tests/):
- verify.py 一条命令跑三层:产物 md5、IK 数值 exact 段、截图。
- 截图基线重做并分级:同一构建连跑两轮实测 102 张逐字节可复现(要求 md5 相同),
  3 张线束 x-ray 不可复现(mean<=0.0017、无像素差>8)改为与参考像素比容差;
  这 3 张不再入库,免得每次跑关卡都脏 git。
- 新增 ?view=sheet / ?sheet=N / ?theme / ?guide=N 四个 URL 参数:工程图与装配向导
  占了约一半 CSS 和 700 行 JS,原先没有任何截图覆盖,拆它们等于没有关卡。
- 关卡灵敏度已验:改坏 IK 基线一个数 -> FAIL;换旧版求解器 -> 5 处 exact 差异。

实测:python -m arm.build_model 退出码 0,全部产物 md5 与基线一致,
105 视图截图全过,IK exact 段逐字节一致。
2026-10-15 03:31:20 +08:00

256 lines
21 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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<R35 的必然产物。现 SEAT_R=35.0、SEAT_TOP=+1.0(越过尾端面 1mm,吃掉半包开口处那截0.052cm3 残片):承压面段整圈挖到外壁,承压面成为完整 R35 平圆盘,凸台与围挡一起消失,电机尾端面与承压面之间再无凸起。承力改由臂身本体承担(band 段 r36..58 有料方位 P04 10/36、其余各 15/36,其余方位靠 z>+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"),
]