component
Adom Machine Pins, Fusion Library + Sample Board
Public Made by Adomby adom
One Fusion 360 .lbr with all four Adom press-fit machine pins (working 3D), plus a sample board (2D/3D/silkscreen) ganging all four together. Fully documented and rebuildable.
← Commit history
Board now real 1.6mm FR4 (was 0.3mm) with manifold-cut through-holes; added large-pin PRESS-FIT callout (0.15mm); single-sided transparent board to kill back-face artifacts
3 files changed
+44−32
AdomMachinePins-4pin-animated.glb⋯ 1 unchanged line ⋯
AdomMachinePins-complete.zip⋯ 1 unchanged line ⋯
scripts/build_board_glb.py+44−32@@ -80,24 +80,35 @@ print("board top z (mm):", round(board_top*1000,3)) scene = trimesh.Scene() -def add_mesh(vv,f,rgba,name,metal=False):+def add_mesh(vv,f,rgba,name,metal=False,double=True): m=trimesh.Trimesh(vertices=vv,faces=f,process=False) r,gr,b,a=rgba m.visual=trimesh.visual.TextureVisuals(material=trimesh.visual.material.PBRMaterial( baseColorFactor=[int(r*255),int(gr*255),int(b*255),int(a*255)], metallicFactor=0.9 if metal else 0.2, roughnessFactor=0.35 if metal else 0.55,- alphaMode="BLEND" if a<0.99 else "OPAQUE", doubleSided=True))+ alphaMode="BLEND" if a<0.99 else "OPAQUE", doubleSided=double)) scene.add_geometry(m,node_name=name,geom_name=name) -# board: FR4 body + soldermask transparent (~0.5), pads/copper opaque gold+# keep the real gold annular pads; REPLACE the thin (0.3mm) Fusion FR4 with a proper 1.6mm slab+board_xy=np.vstack([vv[:,:2] for vv,f,col in board_meshes])+bx0,by0=board_xy.min(0); bx1,by1=board_xy.max(0) for i,(vv,f,col) in enumerate(board_meshes):- is_green = col[1]>=col[0] and col[1]>0.12- is_gold = col[0]>0.6 and col[2]<0.5- if is_gold:+ if col[0]>0.6 and col[2]<0.5: add_mesh(vv,f,[0.85,0.62,0.20,1.0],f"pad_{i}",metal=True)- else:- base=[0.18,0.16,0.06] if not is_green else [0.05,0.42,0.12]- add_mesh(vv,f,base+[0.45],f"board_{i}")++FR4_T=0.0016 # 1.6mm standard FR4+slab=trimesh.creation.box(extents=[bx1-bx0, by1-by0, FR4_T])+slab.apply_translation([(bx0+bx1)/2,(by0+by1)/2, board_top-FR4_T/2])+cutters=[]+for i,(cx,cy) in enumerate(PIN_CENTERS):+ dr=0.00055 if i<2 else 0.001725 # real drill radii: med Ø1.1, lrg Ø3.45+ cyl=trimesh.creation.cylinder(radius=dr, height=FR4_T*2.5)+ cyl.apply_translation([cx,cy,board_top-FR4_T/2])+ cutters.append(cyl)+slab=slab.difference(trimesh.util.concatenate(cutters), engine='manifold') # REAL through-holes+slab.fix_normals() # outward normals so single-sided transparency renders the clean outer shell+add_mesh(slab.vertices, slab.faces, [0.05,0.42,0.12,0.46], "board_fr4", double=False)+print(f"board: 1.6mm FR4 slab {bx1-bx0:.3f}x{by1-by0:.3f}m with {len(cutters)} real drilled holes") # pins: merge each cluster into ONE node so it animates as a unit; detect barrel radius pin_info={}@@ -149,30 +160,31 @@ for k,(c,barrel_r) in pin_info.items(): place_text(spec_s, c[0], y0-0.0018, 1.1, WHITE, f"silk_{k}_1") print(f" silk PIN_{k}: '{name}' / '{spec_s}'") -# --- PRESS-FIT callout: amber text + leader line/arrow pointing at a hole, explaining pin>hole ---+# --- PRESS-FIT callouts: amber text + leader arrow to a hole, explaining pin>hole (both sizes) --- AMBER=[0.98,0.74,0.10,1.0]-cxr,cyr=0.0245,0.0225 # empty board-centre anchor-place_text("PRESS-FIT", cxr, cyr+0.0022, 2.4, AMBER, "callout_0")-place_text("hole Ø1.1 pin Ø1.2", cxr, cyr, 1.5, AMBER, "callout_1")-place_text("pin 0.1mm wider = gas-tight fit", cxr, cyr-0.0020, 1.4, AMBER, "callout_2")-# leader line from the callout to the medium pin @ (40,10) base, on the board surface-tip=np.array([0.0385,0.0112]); start=np.array([0.0315,0.0175])-lead=trimesh.creation.cylinder(radius=0.00016, segment=[[start[0],start[1],board_top+0.00006],- [tip[0],tip[1],board_top+0.00006]])-add_mesh(lead.vertices,lead.faces,AMBER,"callout_leader",metal=False)-# arrowhead cone at the tip-d=tip-start; d=d/np.linalg.norm(d)-head=trimesh.creation.cone(radius=0.00045,height=0.0011,sections=16)-# orient cone (+Z) to lie flat pointing along d-zc=np.array([0,0,1.]); axd=np.array([d[0],d[1],0.]); axd/=np.linalg.norm(axd)-v=np.cross(zc,axd); s_=np.linalg.norm(v); cth=np.dot(zc,axd)-if s_>1e-6:- vx=np.array([[0,-v[2],v[1]],[v[2],0,-v[0]],[-v[1],v[0],0]])- R=np.eye(3)+vx+vx@vx*((1-cth)/(s_*s_)); M=np.eye(4); M[:3,:3]=R- head.apply_transform(M)-head.apply_translation([tip[0],tip[1],board_top+0.00006])-add_mesh(head.vertices,head.faces,AMBER,"callout_arrow",metal=False)-print(" callout: PRESS-FIT leader -> medium pin @ (40,10)")+def callout(anchor, spec_line, why_line, tip, start, prefix):+ place_text("PRESS-FIT", anchor[0], anchor[1]+0.0022, 2.2, AMBER, prefix+"_t")+ place_text(spec_line, anchor[0], anchor[1], 1.5, AMBER, prefix+"_s")+ place_text(why_line, anchor[0], anchor[1]-0.0020, 1.4, AMBER, prefix+"_w")+ tip=np.array(tip); start=np.array(start); z=board_top+0.00006+ lead=trimesh.creation.cylinder(radius=0.00016, segment=[[start[0],start[1],z],[tip[0],tip[1],z]])+ add_mesh(lead.vertices,lead.faces,AMBER,prefix+"_lead",metal=False)+ d=tip-start; d=d/np.linalg.norm(d)+ head=trimesh.creation.cone(radius=0.00045,height=0.0011,sections=16)+ zc=np.array([0,0,1.]); axd=np.array([d[0],d[1],0.]); axd/=np.linalg.norm(axd)+ v=np.cross(zc,axd); s_=np.linalg.norm(v); cth=np.dot(zc,axd)+ if s_>1e-6:+ vx=np.array([[0,-v[2],v[1]],[v[2],0,-v[0]],[-v[1],v[0],0]])+ head.apply_transform(np.block([[np.eye(3)+vx+vx@vx*((1-cth)/(s_*s_)),np.zeros((3,1))],[np.zeros(3),1]]))+ head.apply_translation([tip[0],tip[1],z])+ add_mesh(head.vertices,head.faces,AMBER,prefix+"_arrow",metal=False)++# medium (0.1mm interference) -> medium pin @ (40,10); large (0.15mm) -> large pin @ (10,40)+callout((0.0215,0.0180), "hole Ø1.1 pin Ø1.2", "pin 0.1mm wider = gas-tight",+ (0.0385,0.0112), (0.0300,0.0135), "cmed")+callout((0.0270,0.0315), "hole Ø3.45 pin Ø3.6", "pin 0.15mm wider = gas-tight",+ (0.0132,0.0378), (0.0195,0.0345), "clrg")+print(" callouts: PRESS-FIT -> medium @ (40,10) AND large @ (10,40)") scene.export(OUT) print("exported",OUT)