文件
phonerail/.claude/r2/shell/contact_map.py
T

89 行
3.2 KiB
Python
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# -*- 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)把贴合面加宽。')