R2:底板 / 刀片布局布线脚本、快照、截图与规划文档更新(含外壳、打印件、布线归档)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
@@ -0,0 +1,107 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
u"""只读:端板 R2.1 螺母孔 ↔ 相邻板 R1.7 过孔 的同轴配对(按「横向对齐 + 轴向最近」配)。
|
||||
|
||||
swap_endplate_v12.py 的第一版只比横向偏差,南北板过孔 (x,z) 完全相同,
|
||||
北侧 4 孔全被配到了南板 —— 等于没验北板。这里修正为轴向最近。
|
||||
"""
|
||||
import io
|
||||
import sys
|
||||
|
||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', write_through=True)
|
||||
import win32com.client as wc
|
||||
|
||||
|
||||
def prop(o, n):
|
||||
v = getattr(o, n)
|
||||
return v() if type(v).__name__ in ('method', 'function', 'builtin_function_or_method') else v
|
||||
|
||||
|
||||
def D(x):
|
||||
return x if hasattr(x, '_oleobj_') else wc.Dispatch(x)
|
||||
|
||||
|
||||
app = wc.GetActiveObject('SldWorks.Application')
|
||||
doc = app.ActiveDoc
|
||||
print(u'总装', prop(doc, 'GetTitle'))
|
||||
|
||||
|
||||
def world_holes(comp, radius):
|
||||
xf = list(prop(comp, 'Transform2').ArrayData)
|
||||
R, T = xf[0:9], [xf[9] * 1000, xf[10] * 1000, xf[11] * 1000]
|
||||
out = []
|
||||
for bd in comp.GetBodies2(0) or []:
|
||||
for f in prop(D(bd), 'GetFaces'):
|
||||
s = prop(D(f), 'GetSurface')
|
||||
if not prop(s, 'IsCylinder'):
|
||||
continue
|
||||
cp = list(prop(s, 'CylinderParams'))
|
||||
if abs(cp[6] * 1000 - radius) > 0.01:
|
||||
continue
|
||||
p = [cp[0] * 1000, cp[1] * 1000, cp[2] * 1000]
|
||||
a = cp[3:6]
|
||||
gp = [p[0] * R[0] + p[1] * R[3] + p[2] * R[6] + T[0],
|
||||
p[0] * R[1] + p[1] * R[4] + p[2] * R[7] + T[1],
|
||||
p[0] * R[2] + p[1] * R[5] + p[2] * R[8] + T[2]]
|
||||
ga = [a[0] * R[0] + a[1] * R[3] + a[2] * R[6],
|
||||
a[0] * R[1] + a[1] * R[4] + a[2] * R[7],
|
||||
a[0] * R[2] + a[1] * R[5] + a[2] * R[8]]
|
||||
# 圆柱面的轴点在 CylinderParams 里是任意一点 ⇒ 取面 box 的轴向中点更有意义
|
||||
fb = [v * 1000 for v in prop(D(f), 'GetBox')]
|
||||
out.append((ga, gp, fb))
|
||||
return out
|
||||
|
||||
|
||||
nuts, thru = [], []
|
||||
for c in doc.GetComponents(True):
|
||||
nm = prop(c, 'Name2').upper()
|
||||
if 'ENDPLATE' in nm:
|
||||
nuts += [(nm, *h) for h in world_holes(c, 2.1)]
|
||||
elif any(k in nm for k in ('SOUTHPANEL', 'NORTHPANEL', 'TOPPANEL')):
|
||||
thru += [(nm, *h) for h in world_holes(c, 1.7)]
|
||||
|
||||
# 过孔的装配 box 需要单独取(组件级 box 在世界坐标):用轴点 + 板位置判断即可
|
||||
comp_box = {prop(c, 'Name2').upper(): [v * 1000 for v in c.GetBox(False, False)]
|
||||
for c in doc.GetComponents(True)}
|
||||
|
||||
ok_n = 0
|
||||
for nm, ga, gp, _ in nuts:
|
||||
ai = max(range(3), key=lambda i: abs(ga[i]))
|
||||
o = [i for i in range(3) if i != ai]
|
||||
best = None
|
||||
for tn, ta, tp, _ in thru:
|
||||
if max(range(3), key=lambda i: abs(ta[i])) != ai:
|
||||
continue
|
||||
lat = max(abs(gp[i] - tp[i]) for i in range(3) if i != ai)
|
||||
if lat >= 0.05:
|
||||
continue
|
||||
cb = comp_box[tn]
|
||||
axial = abs((cb[ai] + cb[ai + 3]) / 2.0 - gp[ai]) # 板中面 ↔ 螺母孔轴点
|
||||
if best is None or axial < best[0]:
|
||||
best = (axial, tn, lat)
|
||||
# 螺母孔在角柱里、紧贴该板 ⇒ 轴向距离应在 板厚 + 柱宽 量级(≤ 15)
|
||||
ok = best is not None and best[0] <= 15.0
|
||||
ok_n += ok
|
||||
print(u' %-15s 轴%s (%s=%7.2f, %s=%6.2f) ↔ %-15s 横偏 %.3f 轴距 %5.2f %s'
|
||||
% (nm[:15], 'xyz'[ai], 'xyz'[o[0]], gp[o[0]], 'xyz'[o[1]], gp[o[1]],
|
||||
best[1][:15] if best else '-', best[2] if best else -1,
|
||||
best[0] if best else -1, u'✅' if ok else u'⛔'))
|
||||
print(u'配到相邻板 %d / %d' % (ok_n, len(nuts)))
|
||||
|
||||
# ── 端板 L 脚锁孔(R1.7、轴沿 z)↔ 托盘锁孔(R1.7、轴沿 z)────────────────
|
||||
feet, tray = [], []
|
||||
for c in doc.GetComponents(True):
|
||||
nm = prop(c, 'Name2').upper()
|
||||
hs = world_holes(c, 1.7)
|
||||
zs = [(nm, ga, gp) for ga, gp, _ in hs if abs(ga[2]) > 0.99]
|
||||
if 'ENDPLATE' in nm:
|
||||
feet += zs # 风扇螺孔是轴沿 x 的,已被过滤掉
|
||||
elif 'TRAY' in nm:
|
||||
tray += zs
|
||||
fok = 0
|
||||
for nm, ga, gp in feet:
|
||||
best = min((max(abs(gp[0] - tp[0]), abs(gp[1] - tp[1])), tn) for tn, _, tp in tray) if tray else None
|
||||
ok = best is not None and best[0] < 0.05
|
||||
fok += ok
|
||||
print(u' %-15s 脚锁孔 (x=%7.2f, y=%6.2f) ↔ %-10s 横偏 %.3f %s'
|
||||
% (nm[:15], gp[0], gp[1], best[1][:10] if best else '-', best[0] if best else -1, u'✅' if ok else u'⛔'))
|
||||
print(u'脚锁孔对上托盘 %d / %d(期望 4)' % (fok, len(feet)))
|
||||
在新工单中引用
屏蔽一个用户