# -*- coding: utf-8 -*- u"""派生「短机版」四个脚本(2026-09-13 用户要求缩短整机): 风扇 60×60×25 → **60×60×10(广诚散热,孔距 50.2、配机箱自攻螺丝)**,分风腔 15 → **10**。 topshell_v2 → topshell_v3、bottomplate_v2 → bottomplate_v3、filterframe_v1 → filterframe_v2、place_filter → place_v3。 纯文本补丁,每个锚点断言出现次数。""" import io import sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', write_through=True) T = u'C:\\Users\\35138\\.claude\\jobs\\11836093\\tmp\\' # ── 几何(全部由刀片堆叠 x 4.01~93.49 + 实物风扇 10 + 分风腔 10 推出)───────── IX0, IX1 = -16.0, 113.5 # 内腔(= 风扇外侧面):西 4.01−10.01−10 / 东 93.49+10.01+10 X0, X1 = IX0 - 2.4, IX1 + 2.4 # −18.4 / 115.9 SLOT_T = 4.4 # 滤网框 3+1 厚 + 0.4 间隙 XO = X0 - SLOT_T - 2.0 # −24.8 TA = 3.0 # 滤网框贴墙层加厚(让开自攻螺丝头) PX_W, PX_E = IX0 + 5.0, IX1 - 5.0 # 角柱中心 −11 / 108.5 def patch(src, dst, pairs, head): s = open(T + src, encoding='utf-8').read() for old, new, n in pairs: c = s.count(old) if c != n: raise SystemExit(u'%s:锚点 %r 出现 %d 次(期望 %d)' % (src, old[:60], c, n)) s = s.replace(old, new) s = s.replace(u'# -*- coding: utf-8 -*-\n', u'# -*- coding: utf-8 -*-\n# ' + head + u'\n', 1) open(T + dst, 'w', encoding='utf-8').write(s) print(u'写出', dst) patch('topshell_v2.py', 'topshell_v3.py', [ (u"TopShell_v2.SLDPRT'", u"TopShell_v3.SLDPRT'", 1), (u"'TOPSHELL_V2'", u"'TOPSHELL_V3'", 1), (u"X0, X1, Y0, Y1 = -38.4, 136.4, -4.055, 106.745", u"X0, X1, Y0, Y1 = %.1f, %.1f, -4.055, 106.745" % (X0, X1), 1), (u"IX0, IX1, IY0, IY1 = -36.0, 134.0, -1.655, 104.345", u"IX0, IX1, IY0, IY1 = %.1f, %.1f, -1.655, 104.345" % (IX0, IX1), 1), (u"R_VENT, R_FAN = 30.0, 1.7", u"R_VENT, R_FAN = 30.0, 2.6 # 风扇孔 Ø5.2:机箱自攻螺丝要穿墙拧进风扇 Ø4.4 孔", 1), (u"(-25.0, 25.0)", u"(-25.1, 25.1)", 2), (u"FW, CLR, SLOT_T, LIP_T, SPACER, LIP = 70.0, 0.3, 3.4, 2.0, 4.0, 3.0", u"FW, CLR, SLOT_T, LIP_T, SPACER, LIP = 70.0, 0.3, %.1f, 2.0, 4.0, 3.0" % SLOT_T, 1), (u"if h.get(1.7, 0) != 8 or h.get(2.1, 0) != 4 or h.get(30.0, 0) != 2:", u"if h.get(2.6, 0) != 8 or h.get(2.1, 0) != 4 or h.get(30.0, 0) != 2:", 1), (u"(期望 {1.7: 8, 2.1: 4, 3.0: 4, 30.0: 2})", u"(期望 {2.1: 4, 2.6: 8, 3.0: 4, 30.0: 2})", 1), ], u'v3 短机版:风扇 6010(孔距 50.2、Ø5.2 过孔)+ 分风腔 10;内腔 x −16~113.5、外 −18.4~115.9、导轨唇边 −24.8') patch('bottomplate_v2.py', 'bottomplate_v3.py', [ (u"BottomPlate_v2", u"BottomPlate_v3", 2), (u"'BOTTOMPLATE_V2'", u"'BOTTOMPLATE_V3'", 1), (u"X0, X1, Y0, Y1 = -43.8, 136.4,", u"X0, X1, Y0, Y1 = %.1f, %.1f," % (XO, X1), 1), (u"CORNER_HOLES = [(-31.0, 3.345), (-31.0, 99.345), (129.0, 3.345), (129.0, 99.345)]", u"CORNER_HOLES = [(%.1f, 3.345), (%.1f, 99.345), (%.1f, 3.345), (%.1f, 99.345)]" % (PX_W, PX_W, PX_E, PX_E), 1), ], u'v3 短机版:外形 x −24.8~115.9,四角过孔跟顶盖角柱到 x −11 / 108.5') patch('filterframe_v1.py', 'filterframe_v2.py', [ (u"FilterFrame_v1.SLDPRT'", u"FilterFrame_v2.SLDPRT'", 1), (u"'FILTERFRAME_V1'", u"'FILTERFRAME_V2'", 1), (u"TA, TB = 2.0, 1.0", u"TA, TB = %.1f, 1.0 # 贴墙层 2 → 3:机箱自攻螺丝头比 M3 盘头高,会顶到格栅筋" % TA, 1), ], u'v2:贴墙层加厚到 3(总厚 4),其余同 v1') patch('place_filter.py', 'place_v3.py', [ (u"(u'TopShell_v2.SLDPRT', (0, 0, 74.4), [-43.8, -4.055, -10.0, 136.4,", u"(u'TopShell_v3.SLDPRT', (0, 0, 74.4), [%.1f, -4.055, -10.0, %.1f," % (XO, X1), 1), (u"(u'BottomPlate_v2.SLDPRT', (0, 0, -10.0), [-43.8, -4.055, -12.4, 136.4,", u"(u'BottomPlate_v3.SLDPRT', (0, 0, -10.0), [%.1f, -4.055, -12.4, %.1f," % (XO, X1), 1), (u"u'FilterFrame_v1.SLDPRT'", u"u'FilterFrame_v2.SLDPRT'", 1), (u"-0.0404, 0.016345, -0.010,", u"%.4f, 0.016345, -0.010," % ((X0 - TA) / 1000.0), 1), (u"_w = [-41.4, 16.345, -10.0, -38.4, 86.345, 80.0]", u"_w = [%.1f, 16.345, -10.0, %.1f, 86.345, 80.0]" % (X0 - TA - 1.0, X0), 1), (u"(-38.4 - _b[3], _b[0] - (-41.8),", u"(%.1f - _b[3], _b[0] - (%.1f)," % (X0, X0 - SLOT_T), 1), (u"pw > 14 and pe > 14 else", u"pw > 9 and pe > 9 else", 1), (u"allok &= pw > 14 and pe > 14", u"allok &= pw > 9 and pe > 9", 1), (u"'TOPSHELL', 'BOTTOMPLATE', 'FILTERFRAME')):", u"'TOPSHELL', 'BOTTOMPLATE', 'FILTERFRAME', 'OD60')):", 1), (u"wall = world_holes(shell, 1.7)", u"wall = world_holes(shell, 2.6)", 1), (u"((u'tf_iso', 7), (u'tf_west', 3), (u'tf_top', 1))", u"((u'v3_iso', 7), (u'v3_west', 3), (u'v3_top', 1))", 1), (u" fan_h += world_holes(fc, 2.15)\nallok &= pair(u'端墙风扇孔', wall, fan_h, 0, 8)", u''' fan_h += world_holes(fc, 2.15) # Orion OD6010 模型的安装孔是**腰形孔**:每个孔由两个 R2.15 半圆柱组成(中心 ±1.075), # 模型孔距 50.0;实物(广诚 6010)孔距 50.2 ⇒ 墙孔按 ±25.1 开,与模型预期差 0.1。 # ⇒ 先把离墙孔 1.5 以内的半圆柱轴点取平均得到腰形孔中心,再比偏差,容差放到 0.15。 _ok = 0 _ws = [p for ax, p in wall if ax == 0] for p in _ws: near = [q for ax, q in fan_h if ax == 0 and max(abs(p[1] - q[1]), abs(p[2] - q[2])) < 1.5] if not near: P(u' 墙孔 (y=%.2f, z=%.2f) 附近没有风扇孔 ⛔' % (p[1], p[2])) continue cy = sum(q[1] for q in near) / len(near) cz = sum(q[2] for q in near) / len(near) off = max(abs(p[1] - cy), abs(p[2] - cz)) _ok += off <= 0.15 P(u' 墙孔 (y=%.2f, z=%.2f) ↔ 模型腰孔中心 (%.2f, %.2f) 偏 %.3f %s' % (p[1], p[2], cy, cz, off, u'✅(模型 50.0 vs 实物 50.2)' if off <= 0.15 else u'⛔')) P(u' 风扇孔对上 %d / %d(期望 8)' % (_ok, len(_ws))) allok &= _ok == 8 and len(_ws) == 8''', 1), (u"\ntops = {prop(c, 'Name2'): c for c in doc.GetComponents(True)}", u''' P(u'\\n[1b] 风扇 60×60×25 → 60×60×10(按实物 10 mm:外侧面贴墙)') FAN10 = u'D:\\\\DCDC\\\\新建文件夹\\\\OD6010_m0_frame.SLDPRT' _old = [] for c in list(doc.GetComponents(True)): nm = prop(c, 'Name2') if 'OD60' in nm.upper(): _old.append((list(prop(c, 'Transform2').ArrayData)[0:9], [x * 1000 for x in c.GetBox(False, False)])) doc.ClearSelection2(True) doc.Extension.SelectByID2(nm, 'COMPONENT', 0, 0, 0, False, 0, EMPTY, 0) doc.Extension.DeleteSelection2(0) P(u' 删掉 %%s' %% nm) doc.EditRebuild3 if len(_old) != 2: P(u' ⛔ 旧风扇不是 2 只'); sys.exit(4) def _setrt(c, rot, t): v = wc.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, list(rot) + [t[0] / 1000.0, t[1] / 1000.0, t[2] / 1000.0, 1.0, 0.0, 0.0, 0.0]) xf = wc.Dispatch(mu._oleobj_.Invoke(d2, 0, pythoncom.DISPATCH_METHOD, 1, v)) try: c.SetTransformAndSolve2(xf) except Exception: c.Transform2 = xf doc.EditRebuild3 return [x * 1000.0 for x in c.GetBox(False, False)] for rot, b_old in _old: west = b_old[0] < 50 c = doc.AddComponent4(FAN10, '', 0.0, 0.0, 0.0) if c is None: P(u' ⛔ OD6010 AddComponent4 → None'); sys.exit(5) b0 = _setrt(c, rot, (0, 0, 0)) dx = (%.1f - b0[0]) if west else (%.1f - b0[3]) dy = 51.345 - (b0[1] + b0[4]) / 2 dz = 37.85 - (b0[2] + b0[5]) / 2 b = _setrt(c, rot, (dx, dy, dz)) P(u' %%s风扇 x %%.2f~%%.2f y %%.2f~%%.2f z %%.2f~%%.2f(模型厚 %%.2f,实物 10)' %% (u'西' if west else u'东', b[0], b[3], b[1], b[4], b[2], b[5], b[3] - b[0])) ''' % (IX0, IX1) + u"\ntops = {prop(c, 'Name2'): c for c in doc.GetComponents(True)}", 1), ], u'v3:短机版总装(风扇换 6010、分风腔 10、TopShell_v3 / BottomPlate_v3 / FilterFrame_v2)') print(u'几何:外 x %.1f~%.1f(整机 %.1f),角柱中心 %.1f / %.1f' % (XO, X1, X1 - XO, PX_W, PX_E))