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

41 行
1.7 KiB
Python

import sys, io, json
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace', write_through=True)
import pythoncom, win32com.client as wc
def prop(o, n):
v = getattr(o, n)
return v() if type(v).__name__ in ('method','function','builtin_function_or_method') else v
app = wc.GetActiveObject('SldWorks.Application')
doc = app.ActiveDoc
print('active:', prop(doc,'GetTitle'), '| docs', prop(app,'GetDocumentCount'))
rows = []
for c in doc.GetComponents(True):
nm = prop(c, 'Name2')
try:
b = [round(v*1000, 3) for v in c.GetBox(False, False)]
except Exception:
b = None
rows.append((nm, b))
rows.sort(key=lambda r: (r[1][0] if r[1] else 0))
print('top-level comps:', len(rows))
print('%-34s %8s %8s %8s %8s %8s %8s' % ('name','x0','x1','y0','y1','z0','z1'))
for nm, b in rows:
if b:
print('%-34s %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f' % (nm[:34], b[0],b[3],b[1],b[4],b[2],b[5]))
else:
print('%-34s <no box>' % nm[:34])
blades = sorted([(b[1],b[4],nm) for nm,b in rows if b and 'BLADE' in nm.upper()])
print('\nblade y spans (%d):' % len(blades))
prev = None
for y0,y1,nm in blades:
gap = '' if prev is None else ' gap %.3f' % (y0-prev)
print(' y %8.3f ~ %8.3f centre %8.3f%s' % (y0, y1, (y0+y1)/2, gap))
prev = y1
fans = [(nm,b) for nm,b in rows if b and ('OD6025' in nm.upper() or 'FAN' in nm.upper())]
print('\nfans:')
for nm,b in fans:
print(' %-30s x %8.2f~%8.2f y %8.2f~%8.2f z %8.2f~%8.2f' % (nm[:30], b[0],b[3],b[1],b[4],b[2],b[5]))
json.dump([{'name':nm,'box':b} for nm,b in rows], open('_top.json','w',encoding='utf-8'), ensure_ascii=False, indent=1)
print('\nsaved _top.json')