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 ' % 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')