R2:底板 / 刀片布局布线脚本、快照、截图与规划文档更新(含外壳、打印件、布线归档)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
@@ -0,0 +1,88 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
u"""算外壳各件两两之间的**贴合面**,为螺丝位置提供依据。
|
||||
|
||||
判据:两件在某一轴上「一个的 max ≈ 另一个的 min」(间隙 < 0.05),
|
||||
且在另外两轴上有实际重叠 ⇒ 这两个面是贴合的,重叠矩形就是可打螺丝的区域。
|
||||
|
||||
外壳五件(装配坐标):
|
||||
Tray_v7 x −4~102 y −4~102 z −12.4~0
|
||||
EndPlate ×2 x −27.4~0 / 98~125.4 y −1.655~104.345 z −10~72
|
||||
SouthPanel x −27.4~125.4 y −4.055~−1.655 z −10~72
|
||||
NorthPanel x −27.4~125.4 y 104.345~106.745 z −10~72
|
||||
TopPanel_v2 x −27.4~125.4 y −4~102 z 72~74.4
|
||||
"""
|
||||
import io
|
||||
import sys
|
||||
|
||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', write_through=True)
|
||||
import pythoncom
|
||||
import win32com.client as wc
|
||||
|
||||
ASM = 'PhoneRail_5blades'
|
||||
SHELL = ('TRAY', 'ENDPLATE', 'SOUTHPANEL', 'NORTHPANEL', 'TOPPANEL')
|
||||
AX = 'xyz'
|
||||
|
||||
|
||||
def prop(o, n):
|
||||
v = getattr(o, n)
|
||||
return v() if type(v).__name__ in ('method', 'function', 'builtin_function_or_method') else v
|
||||
|
||||
|
||||
def P(*a):
|
||||
print(*a)
|
||||
|
||||
|
||||
app = wc.GetActiveObject('SldWorks.Application')
|
||||
doc = None
|
||||
for d in app.GetDocuments or []:
|
||||
if ASM in (prop(d, 'GetTitle') or ''):
|
||||
doc = d
|
||||
break
|
||||
if doc is None:
|
||||
P(u'⛔ 没找到总装'); sys.exit(3)
|
||||
e0 = wc.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, 0)
|
||||
app.ActivateDoc3(prop(doc, 'GetTitle'), False, 0, e0)
|
||||
doc = app.ActiveDoc
|
||||
|
||||
parts = []
|
||||
for c in doc.GetComponents(True):
|
||||
nm = prop(c, 'Name2')
|
||||
if any(k in nm.upper() for k in SHELL):
|
||||
b = [round(v * 1000, 3) for v in c.GetBox(False, False)]
|
||||
parts.append((nm, b))
|
||||
parts.sort()
|
||||
P(u'外壳件 %d 个:' % len(parts))
|
||||
for nm, b in parts:
|
||||
P(u' %-18s x %8.2f~%8.2f y %8.2f~%8.2f z %8.2f~%8.2f'
|
||||
% (nm[:18], b[0], b[3], b[1], b[4], b[2], b[5]))
|
||||
|
||||
|
||||
def ov(a0, a1, b0, b1):
|
||||
lo, hi = max(a0, b0), min(a1, b1)
|
||||
return (lo, hi) if hi - lo > 0.01 else None
|
||||
|
||||
|
||||
P(u'\n贴合面(可打螺丝的区域):')
|
||||
found = 0
|
||||
for i in range(len(parts)):
|
||||
for j in range(i + 1, len(parts)):
|
||||
na, ba = parts[i]
|
||||
nb, bb = parts[j]
|
||||
for ax in range(3):
|
||||
o1 = ov(ba[(ax + 1) % 3], ba[(ax + 1) % 3 + 3], bb[(ax + 1) % 3], bb[(ax + 1) % 3 + 3])
|
||||
o2 = ov(ba[(ax + 2) % 3], ba[(ax + 2) % 3 + 3], bb[(ax + 2) % 3], bb[(ax + 2) % 3 + 3])
|
||||
if not (o1 and o2):
|
||||
continue
|
||||
for tag, gap in ((u'%s.max=%s.min' % (na[:12], nb[:12]), abs(ba[ax + 3] - bb[ax])),
|
||||
(u'%s.max=%s.min' % (nb[:12], na[:12]), abs(bb[ax + 3] - ba[ax]))):
|
||||
if gap < 0.05:
|
||||
found += 1
|
||||
a1n, a2n = AX[(ax + 1) % 3], AX[(ax + 2) % 3]
|
||||
P(u' %-28s 沿 %s 贴合' % (tag, AX[ax]))
|
||||
P(u' 重叠区 %s %.2f~%.2f (%.1f) × %s %.2f~%.2f (%.1f)'
|
||||
% (a1n, o1[0], o1[1], o1[1] - o1[0], a2n, o2[0], o2[1], o2[1] - o2[0]))
|
||||
if not found:
|
||||
P(u' ⚠ 一处贴合面都没有 —— 各板之间是悬空的,螺丝无处可打')
|
||||
|
||||
P(u'\n⇒ 螺丝方案要点:贴合区太窄(< 8 mm)就打不下 M3 沉头,')
|
||||
P(u' 需要在端板/托盘上加凸台(boss)把贴合面加宽。')
|
||||
在新工单中引用
屏蔽一个用户