R2:底板 / 刀片布局布线脚本、快照、截图与规划文档更新(含外壳、打印件、布线归档)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
+121
-31
@@ -58,30 +58,81 @@ sys.path.insert(0, HERE)
|
||||
from eda import run # noqa: E402
|
||||
import fp_edge # noqa: E402
|
||||
|
||||
PCB = '3b9c4e39c8d164db' # BLADE-PCB
|
||||
# ⛔⛔ 2026-09-14 起脚本指向 **`BLADE-PCB_1`**(用户新布局,71×62、金手指居中)。
|
||||
# 原 `BLADE-PCB`(3b9c4e39c8d164db,89.5×67,J1_X 45)已出 Gerber、冻结;
|
||||
# 它那一版的脚本与缓存存档在 `archive_blade_R_0914/`,要改它先把这几个常量换回去。
|
||||
PCB = 'c575a2e854057614' # BLADE-PCB_1(R 版:'3b9c4e39c8d164db' BLADE-PCB)
|
||||
MIL = fp_edge.MIL
|
||||
|
||||
# ── 板框(mm,出处 方案 §3.1)─────────────────────────────────────────
|
||||
BW, BH = 90.0, 68.0 # 2026-09-11 由 98×76 压缩(用户拍板)
|
||||
BX0 = 0.5 # ⛔ 2026-09-14 晚:板框左沿 x(原点不再是板角)。70×58 时保持 J1_X=35.5 居中而不挪任何件/线 ⇒ 板框整体右移 0.5
|
||||
BW, BH = 70.0, 55.5 # 2026-09-14 晚:主板南移 2.5 后 58 → 55.5; 2026-09-14 晚 用户要求 70×58(槽改顶边开口,见 TOP_NOTCH);此前 71×62;R 版 89.5×67。 2026-09-14 BLADE-PCB_1 按新摆位收(outline_blade1.py);R 版 89.5×67。 2026-09-11 由 98×76 压缩;2026-09-12 深夜 90×68 → 89.5×67(用户拍板)
|
||||
# ⛔ 2026-09-12 深夜这次只裁**东侧 0.5** 和**北侧 1.0**,器件 / 金手指 / 舌头一律不动:
|
||||
# · 南边不能裁 —— y=0 就是金手指所在的板边(指尖在 y=1.30),从南裁等于切金手指。
|
||||
# · 西边不裁 —— 保持居中就得全板西移(899 段铜 + 346 孔 + 164 件),无现成工具、
|
||||
# 还会作废一批 `_blade_*.json` 缓存;用户拍板改为接受偏心(现为 **0.25**,板宽的 0.3%)。
|
||||
# · **东侧为什么只裁 0.5 而不是 1.0**:卡点是 `VO_P`(4 A 主通道,宽 1.283)那条铜的
|
||||
# 东沿到 **88.391**。裁到 89.0 时铜面界 88.5,而 88.391 + 0.15 = 88.541 > 88.5
|
||||
# ⇒ `INA_ALERT` 的贴边竖线在 y≈54.1~54.25 处**无解,收线宽也救不了**(0.279/0.20/0.15 全试过)。
|
||||
# 唯一的外层出路是少裁 0.5:铜面界 89.0 时窗口 [88.68, 88.86] 宽 0.18,够走。
|
||||
# 裁到 89.0 则必须把那段 12.4 mm 挪到 L15 内层(多 2 个换层孔 + 在 GND 内层切一道缝),
|
||||
# 而多裁的 0.5 mm 只多省 0.6% 面积 —— 用户拍板不拿地平面完整性换。
|
||||
# · 67 零越界:北侧最高的 `J3.4` 焊盘顶在 66.400,新铜面边界 66.5 刚好让过(余 0.10)。
|
||||
# 再往 66.5 走就开始撞 `J3` / `R63` / `EDL_EN`。
|
||||
# ⚠ `IF_Y` 跟手机走(= PHONE_ORG[1]+PHONE_WH[1] = 55.66)、**不跟 BH**,所以改 BH 只是
|
||||
# 把服务带从 12.34 压到 **11.34** —— 正好是 §34 算过的下限「C60 本体 11 + 0.34」,
|
||||
# 手机投影与两条排线槽都不受影响。再压就放不下 C60。
|
||||
# ⚠ 判据教训:算东侧窗口时**只看过孔会得出错误结论**。第一版漏了 `VO_P` 那条 1.283 宽的铜
|
||||
# (只按它的过孔东沿 88.055 算),得出「裁 1.0 可行」;按线段实际占用逐 y 重扫才发现无解。
|
||||
CORNER_R = 2.0
|
||||
# ── 金手指两侧的台阶(2026-09-12 用户指出「金手指两侧没有开槽,插不进插槽」)──────────
|
||||
# PCI-E 卡在金手指那一段是「凸」字形:只有舌头伸进插槽,两侧板材必须收到槽体顶面以上。
|
||||
# 刀片原来是一整块 90×68 的圆角矩形,底边一条直线 ⇒ 塑料体(39 mm,两端封闭)会顶住
|
||||
# x<27 / x>63 的板材,**插不到底**。
|
||||
# 舌头 36.0 宽(用户拍板,比金手指 33.70 两侧各多 1.15);台阶高 12.0(槽体 ~9,余 3)。
|
||||
# 舌头原为 36.0(用户拍板,比金手指 33.70 两侧各多 1.15);台阶高 12.0(槽体 ~9,余 3)。
|
||||
# ⛔ 2026-09-12 晚:**36.0 插不进去**。SolidWorks 量厂商 STEP 里 `PCIE-64P11L` 的
|
||||
# 顶面内环(= 卡槽开口)得 **35.08**(x ±17.540,中间 0.78 是防呆键筋),
|
||||
# 36.0 比它宽 **0.92**,舌头两端会压在腔的端壁上 —— 这也解释了干涉扫描里
|
||||
# 「刀片底边停在塑料体顶面、插入深度 d=0」的现象。⇒ 用户拍板收到 **34.5**。
|
||||
# · 金手指铜 28.15~61.85(33.70 宽)⇒ 两侧余量 1.15 → **0.40**,
|
||||
# 仍大于 DRC 的板边规则 0.3(`pcb_rules` 只把 ≤0.2 的格子归一到 MINC,
|
||||
# 0.254/0.3 那几格是孔/板边相关、不动),可做。
|
||||
# · 对插槽开口留 (35.08−34.5)/2 = **0.29/侧**。
|
||||
# ⚠ 35.08 是**厂商 STEP 的标称值、不含公差**,待卡尺实测复核(PROGRESS 待办 ⭐①)。
|
||||
# 内凹角必须倒圆角:外形铣刀下不去直角,取 R1.0。
|
||||
# ⚠ 台阶 12.0 > 手机主板落点 y0 = 11.0 ⇒ 主板投影底边在舌头两侧**悬空 1.0 mm**
|
||||
# (左 x 1.50~27.00 / 右 x 63.00~68.59)。7 个定位孔最南 y=14.46 全在板材上、
|
||||
# 主板靠 M1.6 尼龙立柱固定而不是靠边缘托住 ⇒ 无害,但 selfcheck 的分区断言要按舌头口径判。
|
||||
TONGUE_X0, TONGUE_X1 = 27.0, 63.0
|
||||
STEP_H = 12.0
|
||||
TONGUE_X0, TONGUE_X1 = 18.25, 52.75 # 2026-09-14 跟 J1_X 35.5 居中(R 版 27.75 / 62.25)。 34.5 宽(2026-09-12 晚由 36.0 收窄,见上)
|
||||
# ⛔ 2026-09-12 深夜 用户拍板:台阶高 **12.0 → 9.9**(「让舌头变短」)。
|
||||
# `STEP_H` 是**台阶切掉的高度**:y <= STEP_H 只有舌头(x TONGUE_X0~X1)有板材,y > STEP_H 是全宽板主体。
|
||||
# ⇒ 降低它 = 舌头变短、两侧原本被切掉的部分**恢复成板材** ⇒ **板材反而多 115.5 mm²**
|
||||
# (两侧切掉 660.0 → 544.5),外接尺寸 89.5×67 不变。想减面积的话方向是反的,别搞错。
|
||||
# ## 9.9 是下限,再低就出结构问题
|
||||
# · **桥宽** = STEP_H − NOTCH_D = 9.9 − 8.3 = **1.60**:缺口从板边往上挖 8.3 深,
|
||||
# 缺口顶到台阶肩部这段板材是**舌头左右两半唯一的连接**。8.31 时桥宽只有 0.01 ⇒ 等于切断
|
||||
# (那个数只保证「缺口不被切开」,没保证「缺口上方还有板材」—— 定档时踩过这个坑)。
|
||||
# · **肩部余量** = STEP_H − 插入深度 8.00 = **1.90**(零件本地坐标:塑料体顶面 10.000 / 槽底 2.000)。
|
||||
# 8.31 时只剩 0.31,太浅。⚠ 别拿底板坐标的 z=12.33 算这个数,那是另一套坐标系。
|
||||
# · **丝印** 带上沿 9.40,离肩部正好 0.5(= silk_blade.EDGE)。
|
||||
# ## 实判:丝印与 J1 位号都不会被铣掉
|
||||
# 丝印 8.40~9.40 完全在舌头内;J1 位号 9.56~10.70 **跨过肩部线**,但下半在舌头上、
|
||||
# 上半在全宽主体上,四角都有板材。⚠ `silk_blade` 会因「离轮廓 0」多报 1 条越框 ——
|
||||
# 那是判据保守(轮廓线穿过文字框),不是真悬空;J1 已在 KEEP 白名单,算法不会乱挪它。
|
||||
STEP_H = 9.9
|
||||
STEP_R = 1.0 # 台阶内凹角(铣刀半径,嘉立创外形最小 R0.5,取 1.0 稳)
|
||||
CORNER_SEG = 8 # 每个 R2 圆角用几段折线
|
||||
OUTLINE_W = 0.15
|
||||
|
||||
# 金手指阵列中心。**居中**:刀片 98 宽、插槽体只有 39,居中让两侧悬臂等长
|
||||
# (左边是手机主板、右边是功率列,两头都不轻)。⚠ 底板的 5 个插槽必须按同一个数摆。
|
||||
J1_X, J1_Y, J1_ROT = BW / 2.0, 0.0, 0
|
||||
# ⛔ 2026-09-12 深夜:原来是 `BW / 2.0`(跟着板宽居中)。板宽 90→89 之后那会算出 44.5,
|
||||
# **金手指连同舌头整体平移 0.5,全板器件与 64 根线立刻对不上**。这次是「只裁东侧、
|
||||
# 器件不动」,所以把它**解耦成常数 45.0**(= 原来的 90/2,金手指绝对位置一点没变)。
|
||||
# 代价是金手指不再严格居中:左 45.00 / 右 44.50,偏心 **0.25** = 板宽的 0.3%,用户已拍板接受。
|
||||
# ⚠ 以后再改 BW,J1_X **不会**自动跟着走 —— 要居中就手动改这个数,并且记住那意味着全板平移。
|
||||
BX1 = BX0 + BW # 板框右沿 x
|
||||
J1_X, J1_Y, J1_ROT = 35.5, 0.0, 0 # 2026-09-14 BLADE-PCB_1 居中 = BX0 + BW/2(R 版 45.0)
|
||||
|
||||
# ── 小米8 主板的落点 + 定位孔(板级事实,摆位/布线/铺铜都从这里取)────────
|
||||
# 主板 67.09 × 44.66,长边水平、**接口边(v=0,J600/J1401/侧键都在上面)朝下**。
|
||||
@@ -92,7 +143,10 @@ J1_X, J1_Y, J1_ROT = BW / 2.0, 0.0, 0
|
||||
# x 不变(1.5):H6/H7(u≈64.7)转过来落在左边,螺钉头离板边 2.2 − 1.6 = 0.6 以上。
|
||||
# ⚠ SIM 卡托在 u 大的那一端(mi8_mech 注释:轮廓 70.3 含卡托 3.3)⇒ 转过来在**左边**,
|
||||
# 装着卡托的话会伸出板左沿 ~1.8 mm(机箱侧壁要让)。
|
||||
PHONE_ORG = (1.5, 11.0)
|
||||
# ⛔ 2026-09-14 晚 用户要求「主板南移,进一步缩小」:y 11.0 → **8.5**(南移 2.5 = 上限)。
|
||||
# 上限来自插槽:刀片坐到槽底时塑料体顶面在刀片 y = 8.0(厂商 STEP 本地 z 10.000 − 槽底 2.000),塑料体沿 x 占 J1_X±19.5,
|
||||
# 正好在主板投影下 ⇒ 主板远端边留 0.5 到塑料体顶。台阶 STEP_H 9.9 以下舌头两侧没板材 ⇒ 主板那一段悬空 1.4(selfcheck 上限 1.5)。
|
||||
PHONE_ORG = (1.5, 8.5)
|
||||
PHONE_WH = (67.09, 44.66)
|
||||
PHONE_ROT = 180
|
||||
IF_Y = round(PHONE_ORG[1] + PHONE_WH[1], 3) # 接口边(v=0)在板上的 y:55.66
|
||||
@@ -122,6 +176,11 @@ HOLE_VIA_KEEP = 1.5 # 孔到过孔/铜的最小中心距(孔半
|
||||
|
||||
def phone_holes():
|
||||
u"""{名字: (x, y)},刀片坐标。"""
|
||||
# ⛔ 2026-09-15 BLADE-PCB_1 新摆位:用户在板上挪过 H2 / H3(与 mi8_mech 推算的不再一致)⇒ 板面为准,
|
||||
# 有读回快照 `_blade_holes_live.json` 就用它。
|
||||
live = os.path.join(HERE, '_blade_holes_live.json')
|
||||
if os.path.exists(live):
|
||||
return {k: tuple(v) for k, v in json.load(io.open(live, encoding='utf-8')).items()}
|
||||
m = json.load(io.open(os.path.join(os.path.dirname(HERE), 'mi8_mech.json'),
|
||||
encoding='utf-8'))
|
||||
return {k: phone_xy(u, v) for k, (u, v) in m['holes'].items()}
|
||||
@@ -153,6 +212,10 @@ SLOT_RIB = 2.0 # 槽顶到板边留的肋(顶边导轨也咬
|
||||
SLOT_W = {'BAT': 12.0, 'TAIL': 20.0} # 排线 8 / 18,各留余量
|
||||
FLEX_W = {'BAT': 8.0, 'TAIL': 18.0}
|
||||
SLOT_R = 1.0 # 槽内圆角(铣刀半径,嘉立创内槽最小 R0.5)
|
||||
# ⛔ 2026-09-14 晚:板高 58 < 槽顶 59.86 + 肋 ⇒ **两条槽改成从顶边开口的缺口**(用户拍板)。
|
||||
# 缺口画进板框折线(不再是 layer 12 挖槽区域),底部两个内角 R=SLOT_R;外角(与顶边相交处)直角。
|
||||
# 代价:顶边 70 里 32 mm 是开口,顶部导轨只能咬 x 0.5~5.0 / 25.0~38.8 / 50.8~70.5 三段。
|
||||
TOP_NOTCH = True
|
||||
|
||||
|
||||
def flex_x():
|
||||
@@ -170,7 +233,10 @@ def flex_slots():
|
||||
|
||||
|
||||
def mill_cuts():
|
||||
u"""板上全部铣穿的内槽 [(x0,y0,x1,y1)] —— 布线 / 铺铜 / 摆位都从这里取障碍。"""
|
||||
u"""板上全部铣穿的内槽 [(x0,y0,x1,y1)] —— 布线 / 铺铜 / 摆位都从这里取障碍。
|
||||
TOP_NOTCH 时槽一直开到板外(y1 = BH + 1),障碍语义不变。"""
|
||||
if TOP_NOTCH:
|
||||
return [(a, b, c, BH + 1.0) for (a, b, c, d) in flex_slots().values()]
|
||||
return list(flex_slots().values())
|
||||
|
||||
|
||||
@@ -185,7 +251,7 @@ def slot_check():
|
||||
bad.append(u'槽 %s 离螺钉孔 %s 只有 %.2f < %.1f' % (k, hn, math.hypot(dx, dy), HOLE_KEEP))
|
||||
if w[1] < IF_Y:
|
||||
bad.append(u'槽 %s 底 %.1f 进了手机投影(接口边 %.1f)' % (k, w[1], IF_Y))
|
||||
if w[3] > BH - SLOT_RIB:
|
||||
if not TOP_NOTCH and w[3] > BH - SLOT_RIB:
|
||||
bad.append(u'槽 %s 顶 %.1f 离板边不到 %.1f 的肋' % (k, w[3], SLOT_RIB))
|
||||
s = flex_slots()
|
||||
a, b = sorted(s.values())
|
||||
@@ -200,18 +266,28 @@ PHONE_X1 = round(PHONE_ORG[0] + PHONE_WH[0], 3) # 手机右沿 68.59
|
||||
POWER_X0 = round(PHONE_X1 + 2.0, 3) # 功率列西沿 70.59(离手机 2 mm)
|
||||
ZONES = {
|
||||
'finger': (TONGUE_X0, 0.0, TONGUE_X1, STEP_H), # 舌头(唯一伸进插槽的那块):不许放件
|
||||
'service': (0.0, IF_Y, POWER_X0, BH), # 服务带(2026-09-11 晚起在顶部):C60 / 两条排线槽 / J3
|
||||
'service': (BX0, IF_Y, POWER_X0, BH), # 服务带(2026-09-11 晚起在顶部):C60 / 两条排线槽 / J3
|
||||
'phone': (PHONE_ORG[0], PHONE_ORG[1], PHONE_X1, round(PHONE_ORG[1] + PHONE_WH[1], 3)),
|
||||
'power': (POWER_X0, STEP_H, BW, BH), # 功率列
|
||||
'power': (POWER_X0, STEP_H, BX1, BH), # 功率列
|
||||
}
|
||||
|
||||
|
||||
def corner(cx, cy, a0, a1):
|
||||
u"""圆角折线点列(角度 deg,逆时针)。"""
|
||||
def corner(cx, cy, a0, a1, r=None):
|
||||
u"""圆角折线点列(角度 deg,逆时针)。`r` 省略时用 `CORNER_R`(板四角)。
|
||||
|
||||
⛔⛔ 2026-09-12 晚修的 bug:这里原来**写死 `CORNER_R`**,而台阶那两个内凹角
|
||||
调用时只把 `STEP_R` 用在了**弧心偏移**上 ⇒ 弧心 (TONGUE_X0−1.0, 11.0) 配半径 2.0,
|
||||
弧的终点落在 x = 26.75+2.0 = **28.75** 而不是 27.75,于是舌头侧边变成一条
|
||||
从 (28.75, 11.0) 斜到 (27.75, 0.0) 的**斜线** —— 舌头尖端 34.5 宽,到 y=11 处
|
||||
只剩 **32.5**。几何校验、DRC 在旧尺寸下都不报(斜边最大只到 x=28.0,够不着线),
|
||||
**把舌头收窄之后才显形**:x=28.50 的 +12V / PRSNT# 在 y>8.25 处被斜边切到板外。
|
||||
⇒ 教训:**参数传进去了不等于用上了**;`STEP_R` 只影响弧心、不影响半径,
|
||||
而这类错误画出来的形状仍然“看着像个圆角”,靠截图也看不出来。"""
|
||||
rr = CORNER_R if r is None else r
|
||||
pts = []
|
||||
for k in range(CORNER_SEG + 1):
|
||||
a = math.radians(a0 + (a1 - a0) * k / CORNER_SEG)
|
||||
pts.append((cx + CORNER_R * math.cos(a), cy + CORNER_R * math.sin(a)))
|
||||
pts.append((cx + rr * math.cos(a), cy + rr * math.sin(a)))
|
||||
return pts
|
||||
|
||||
|
||||
@@ -229,17 +305,26 @@ def outline_pts():
|
||||
r, ri, hs = CORNER_R, STEP_R, STEP_H
|
||||
pts = [(TONGUE_X0, 0.0), (TONGUE_X1, 0.0)] # 舌头底边(缺口在中间断开)
|
||||
pts += [(TONGUE_X1, hs - ri)]
|
||||
pts += corner(TONGUE_X1 + ri, hs - ri, 180, 90) # 右侧台阶内凹角
|
||||
pts += [(BW - r, hs)]
|
||||
pts += corner(BW - r, hs + r, 270, 360) # 右下外角
|
||||
pts += [(BW, BH - r)]
|
||||
pts += corner(BW - r, BH - r, 0, 90) # 右上
|
||||
pts += [(r, BH)]
|
||||
pts += corner(r, BH - r, 90, 180) # 左上
|
||||
pts += [(0.0, hs + r)]
|
||||
pts += corner(r, hs + r, 180, 270) # 左下外角
|
||||
pts += corner(TONGUE_X1 + ri, hs - ri, 180, 90, ri) # 右侧台阶内凹角(半径必须传 ri)
|
||||
x0, x1 = BX0, BX1
|
||||
pts += [(x1 - r, hs)]
|
||||
pts += corner(x1 - r, hs + r, 270, 360) # 右下外角
|
||||
pts += [(x1, BH - r)]
|
||||
pts += corner(x1 - r, BH - r, 0, 90) # 右上
|
||||
if TOP_NOTCH: # 顶边自右向左,逐个绕进缺口
|
||||
for (a, b, c, _d) in sorted(flex_slots().values(), reverse=True):
|
||||
R = SLOT_R
|
||||
pts += [(c, BH), (c, b + R)]
|
||||
pts += corner(c - R, b + R, 0, -90, R) # 缺口右下内角
|
||||
pts += [(a + R, b)]
|
||||
pts += corner(a + R, b + R, 270, 180, R) # 缺口左下内角
|
||||
pts += [(a, BH)]
|
||||
pts += [(x0 + r, BH)]
|
||||
pts += corner(x0 + r, BH - r, 90, 180) # 左上
|
||||
pts += [(x0, hs + r)]
|
||||
pts += corner(x0 + r, hs + r, 180, 270) # 左下外角
|
||||
pts += [(TONGUE_X0 - ri, hs)]
|
||||
pts += corner(TONGUE_X0 - ri, hs - ri, 90, 0) # 左侧台阶内凹角
|
||||
pts += corner(TONGUE_X0 - ri, hs - ri, 90, 0, ri) # 左侧台阶内凹角(半径必须传 ri)
|
||||
pts += [(TONGUE_X0, 0.0)]
|
||||
out = [pts[0]]
|
||||
for q in pts[1:]:
|
||||
@@ -342,7 +427,7 @@ def selfcheck():
|
||||
for pin in ('A1', 'A32'):
|
||||
x, y, w, h = fp_edge.pad_geom(pin)
|
||||
ax = J1_X + x
|
||||
assert 0.5 < ax < BW - 0.5, u'%s 跑出板外: x=%.2f' % (pin, ax)
|
||||
assert BX0 + 0.5 < ax < BX1 - 0.5, u'%s 跑出板外: x=%.2f' % (pin, ax)
|
||||
top = fp_edge.EDGE_CLR + fp_edge.LONG_L
|
||||
assert top < ZONES['finger'][3], u'手指顶到服务带'
|
||||
assert fp_edge.NOTCH_D < ZONES['finger'][3], u'缺口比金手指区还深'
|
||||
@@ -443,7 +528,8 @@ def slot_src(x0, y0, x1, y1):
|
||||
|
||||
|
||||
def push_slots():
|
||||
S = [[k, slot_src(*w)] for k, w in sorted(flex_slots().items())]
|
||||
# TOP_NOTCH:槽已经画进板框折线,这里只负责把旧的 layer 12 挖槽区域删光(S 为空)
|
||||
S = [] if TOP_NOTCH else [[k, slot_src(*w)] for k, w in sorted(flex_slots().items())]
|
||||
r = call(PUSH_SLOTS_JS % (PCB, json.dumps(S)), timeout=300)
|
||||
print(u'排线槽(layer 12 挖槽区域): 建 %d / 失败 %s(删旧 %d);板上现有 %d 个'
|
||||
% (r['made'], r['fail'] or u'无', r['del'], r['now']))
|
||||
@@ -473,8 +559,9 @@ def verify():
|
||||
# 删不掉也不必删 —— 板框已经由折线自己闭合,它们只是重复的图形。
|
||||
if r['line11'] not in (0, 16):
|
||||
bad.append(u'层 11 上还有 %d 条导线(只该剩 J1 封装那 16 条或 0 条)' % r['line11'])
|
||||
if r['fills'] != len(flex_slots()):
|
||||
bad.append(u'layer 12 挖槽区域 %d 个 != %d' % (r['fills'], len(flex_slots())))
|
||||
want_fills = 0 if TOP_NOTCH else len(flex_slots())
|
||||
if r['fills'] != want_fills:
|
||||
bad.append(u'layer 12 挖槽区域 %d 个 != %d' % (r['fills'], want_fills))
|
||||
pts = []
|
||||
src = r['poly']
|
||||
if isinstance(src, dict):
|
||||
@@ -494,9 +581,9 @@ def verify():
|
||||
if pts:
|
||||
xs = [p[0] for p in pts]
|
||||
ys = [p[1] for p in pts]
|
||||
if abs(min(xs)) > 0.01 or abs(max(xs) - BW) > 0.01 or abs(min(ys)) > 0.01 or abs(max(ys) - BH) > 0.01:
|
||||
if abs(min(xs) - BX0) > 0.01 or abs(max(xs) - BX1) > 0.01 or abs(min(ys)) > 0.01 or abs(max(ys) - BH) > 0.01:
|
||||
bad.append(u'板框外接矩形 %.2f~%.2f x %.2f~%.2f != 0~%.1f x 0~%.1f'
|
||||
% (min(xs), max(xs), min(ys), max(ys), BW, BH))
|
||||
% (min(xs), max(xs), min(ys), max(ys), BX1, BH))
|
||||
if abs(pts[0][0] - pts[-1][0]) > 0.01 or abs(pts[0][1] - pts[-1][1]) > 0.01:
|
||||
bad.append(u'折线首尾不重合:%s vs %s' % (pts[0], pts[-1]))
|
||||
if abs(len(pts) - len(want)) > 1:
|
||||
@@ -554,7 +641,10 @@ if __name__ == '__main__':
|
||||
print(u' %-3s (%6.2f, %6.2f)' % (k, v[0], v[1]))
|
||||
sys.exit(0)
|
||||
bl, br = notch_break()
|
||||
print(u'刀片 %.0f x %.0f,四角 R%.1f;金手指中心 x=%.2f' % (BW, BH, CORNER_R, J1_X))
|
||||
# ⚠ 必须 %.1f:2026-09-12 深夜板宽变成 89.5 之后,原来的 %.0f 把它印成「90」,
|
||||
# 而板宽正是这次改动的主角 —— 下个会话一眼看过去会以为没改成。
|
||||
print(u'刀片 %.1f x %.1f,四角 R%.1f;金手指中心 x=%.2f(偏心 %.2f)'
|
||||
% (BW, BH, CORNER_R, J1_X, abs(J1_X - (BX0 + BW / 2.0))))
|
||||
print(u'底边断点: %.2f ~ %.2f(缺口口部)' % (bl, br))
|
||||
print(u'金手指跨度: x %.2f ~ %.2f,指顶 y=%.2f,缺口顶 y=%.2f'
|
||||
% (J1_X + fp_edge.PIN_X['A1'] - fp_edge.FW / 2,
|
||||
|
||||
在新工单中引用
屏蔽一个用户