142 行
8.0 KiB
Python
142 行
8.0 KiB
Python
# -*- 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))
|