# -*- coding: utf-8 -*- u"""由 topshell_v1.py 派生 topshell_v2.py(加西端滤网导轨 + 内联倒角),只做文本补丁,不碰 SolidWorks。""" import io import sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', write_through=True) SRC = r'C:\Users\35138\.claude\jobs\11836093\tmp\topshell_v1.py' DST = r'C:\Users\35138\.claude\jobs\11836093\tmp\topshell_v2.py' s = open(SRC, encoding='utf-8').read() def rep(old, new, count=1): global s n = s.count(old) if n != count: raise SystemExit(u'锚点 %r 出现 %d 次(期望 %d)' % (old[:40], n, count)) s = s.replace(old, new) rep(u'# -*- coding: utf-8 -*-\nu"""**一体顶盖** TopShell_v1', u'# -*- coding: utf-8 -*-\nu"""**v2 = v1 + 西端插拔式滤网导轨 + 建模内倒角**(2026-09-13)。\n' u'导轨让包围盒西界变成唇边 x −43.8,add_fillets 的「包围盒角」判据会漏掉西侧两角 ⇒ 圆角在加导轨之前做。\n\n' u'(以下为 v1 说明)**一体顶盖** TopShell_v1') rep(u"TopShell_v1.SLDPRT'", u"TopShell_v2.SLDPRT'") rep(u"'TOPSHELL_V1'", u"'TOPSHELL_V2'") FILLET = u''' # ── [3b] 外轮廓 4 条竖边倒 R3(此时包围盒 = 盒体本身,导轨还没加)───────── P(u'\\n[3b] 外轮廓竖边倒 R3') _bx = bbox() _cand = [] for _e in prop(D(bodies()[0]), 'GetEdges'): _E = D(_e) try: _p0 = [v * 1000 for v in prop(D(prop(_E, 'GetStartVertex')), 'GetPoint')] _p1 = [v * 1000 for v in prop(D(prop(_E, 'GetEndVertex')), 'GetPoint')] except Exception: continue if abs(_p0[0] - _p1[0]) > 1e-6 or abs(_p0[1] - _p1[1]) > 1e-6 or abs(_p0[2] - _p1[2]) < 1e-6: continue if all(min(abs(_p[i] - _bx[i]), abs(_p[i] - _bx[i + 3])) < 0.01 for _p in (_p0, _p1) for i in (0, 1)): _cand.append(_E) _done = 0 for _E in _cand: for _r in (3.0, 2.0, 1.5): part.ClearSelection2(True) _E.Select4(False, EMPTY) try: _f = fm.FeatureFillet3(195, M(_r), 0, 0, 0, 0, 0, None, None, None, None, None, None, None) except Exception: _f = None if _f: _done += 1 break P(u' 候选 %d 条,成功 %d 条;直方图 %s' % (len(_cand), _done, hist())) if _done != 4 or hist().get(3.0, 0) != 4: P(u'⛔ 圆角没做全,停手'); sys.exit(8) ''' rep(u'\n# ── 面上草图切除(带候选映射)', FILLET + u'\n# ── 面上草图切除(带候选映射)') RAILS = u''' # ── [6b] 西端插拔式滤网导轨(前视面草图 L 形轮廓,向 −z 拉满高)─────────── FW, CLR, SLOT_T, LIP_T, SPACER, LIP = 70.0, 0.3, 3.4, 2.0, 4.0, 3.0 XO = X0 - SLOT_T - LIP_T # 唇边外表面 −43.8 YS0, YS1 = FAN_CY - FW / 2 - CLR, FAN_CY + FW / 2 + CLR # 滑槽 y 16.045 ~ 86.645 P(u'\\n[6b] 滤网导轨:滑槽 x %.1f~%.1f(厚 %.1f)、y %.3f~%.3f;唇边 x %.1f~%.1f 压边 %.1f' % (X0 - SLOT_T, X0, SLOT_T, YS0, YS1, XO, X0 - SLOT_T, LIP)) rails = [ [(X0, YS0 - SPACER), (XO, YS0 - SPACER), (XO, YS0 + LIP), (X0 - SLOT_T, YS0 + LIP), (X0 - SLOT_T, YS0), (X0, YS0)], [(X0, YS1 + SPACER), (XO, YS1 + SPACER), (XO, YS1 - LIP), (X0 - SLOT_T, YS1 - LIP), (X0 - SLOT_T, YS1), (X0, YS1)], ] pick(u'前视基准面', 'PLANE') sm.InsertSketch(True) sm.AddToDB = True for poly in rails: for i in range(len(poly)): a, b = poly[i], poly[(i + 1) % len(poly)] sm.CreateLine(M(a[0]), M(a[1]), 0.0, M(b[0]), M(b[1]), 0.0) sm.AddToDB = False sm.InsertSketch(True) boss(H, True) lips = [(fb[1], fb[4]) for ax, sg, fb, a, _ in planes() if ax == 0 and sg == -1 and abs(fb[0] - XO) < 0.02 and abs(fb[3] - XO) < 0.02] P(u' 唇边外表面 %d 个(期望 2):%s' % (len(lips), [(round(a, 3), round(b, 3)) for a, b in sorted(lips)])) want_l = [(YS0 - SPACER, YS0 + LIP), (YS1 - LIP, YS1 + SPACER)] if len(lips) != 2 or any(abs(a - c) > 0.02 or abs(b - d) > 0.02 for (a, b), (c, d) in zip(sorted(lips), want_l)): P(u'⛔ 导轨不对,停手'); sys.exit(9) ''' rep(u'\n# ── 验收 ──', RAILS + u'\n# ── 验收 ──') rep(u"check(u'最终', [X0, Y0, -H, X1, Y1, 0.0])", u"check(u'最终', [XO, Y0, -H, X1, Y1, 0.0])") rep(u"(期望 {1.7: 8, 2.1: 4, 30.0: 2})", u"(期望 {1.7: 8, 2.1: 4, 3.0: 4, 30.0: 2})") open(DST, 'w', encoding='utf-8').write(s) print(u'写出', DST)