# -*- 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)把贴合面加宽。')