component
Wakefield Thermal 680-125220 TO-220 heatsink
Public Made by Adomby adom
Bolt-on aluminum heatsink with provisional drawing-led geometry and explicit off-board mechanical roles.
main
"""MIT Adom fan component GLB helpers; geometry in millimetres."""
import json,struct
def read_glb(path):
b=path.read_bytes();n=struct.unpack_from('<I',b,12)[0];g=json.loads(b[20:20+n]);p=20+n;length=struct.unpack_from('<I',b,p)[0];return g,bytearray(b[p+8:p+8+length])
def write_glb(path,g,blob):
g['buffers'][0]['byteLength']=len(blob);j=json.dumps(g,separators=(',',':')).encode();j+=b' '*(-len(j)%4);blob+=b'\0'*(-len(blob)%4)
path.write_bytes(struct.pack('<III',0x46546c67,2,28+len(j)+len(blob))+struct.pack('<II',len(j),0x4e4f534a)+j+struct.pack('<II',len(blob),0x004e4942)+blob)
def add_shape(g,blob,shape,name,color,parent,tooltip):
vertices,triangles=shape.tessellate(.08,.18);pts=[[v.x*.001,v.y*.001,v.z*.001]for v in vertices];indices=[i for t in triangles for i in t]
def acc(flat,count,kind,ctype,fmt,bounds=None):
blob.extend(b'\0'*(-len(blob)%4));off=len(blob);blob.extend(struct.pack('<'+fmt*len(flat),*flat));vi=len(g.setdefault('bufferViews',[]));g['bufferViews'].append({'buffer':0,'byteOffset':off,'byteLength':len(blob)-off});ai=len(g['accessors']);x={'bufferView':vi,'componentType':ctype,'count':count,'type':kind}
if bounds:x.update(min=bounds[0],max=bounds[1])
g['accessors'].append(x);return ai
pa=acc([x for p in pts for x in p],len(pts),'VEC3',5126,'f',([min(p[i]for p in pts)for i in range(3)],[max(p[i]for p in pts)for i in range(3)]));ia=acc(indices,len(indices),'SCALAR',5125,'I')
mi=len(g.setdefault('materials',[]));g['materials'].append({'name':name+'.Material','pbrMetallicRoughness':{'baseColorFactor':[*color,1],'metallicFactor':.65 if 'Contact' in name or 'Stripped' in name else 0,'roughnessFactor':.55},'doubleSided':True})
mesh=len(g.setdefault('meshes',[]));g['meshes'].append({'name':name,'primitives':[{'attributes':{'POSITION':pa},'indices':ia,'material':mi}]});node=len(g['nodes']);g['nodes'].append({'name':name,'mesh':mesh,'extras':{'tooltip':tooltip}});g['nodes'][parent].setdefault('children',[]).append(node)