tau = 6.283; function rads2degs(rads) = rads * 360/tau; function ClipHook_r2(w,g,l,ye,k) = w/2 + g + w/2; function ClipHook_r3(w,g,l,ye,k) = k * ClipHook_r2(w,g,l,ye,k); function ClipHook_yce(w,g,l,ye,k) = g/2 + w + g + w/2 - ClipHook_r3(w,g,l,ye,k); function ClipHook_xe(w,g,l,ye,k) = sqrt(pow( ClipHook_r3(w,g,l,ye,k), 2) - pow( ClipHook_yce(w,g,l,ye,k) + ye, 2)); module ClipHook(w=1.2, g=0.2, l=0.0, ye=0, k=3.0, h=3.5) { r2 = ClipHook_r2(w,g,l,ye,k); r3 = ClipHook_r3(w,g,l,ye,k); yce = ClipHook_yce(w,g,l,ye,k); xe = ClipHook_xe(w,g,l,ye,k); xc = -l/2; yc = g/w + w/2; echo("ClipHook(w g l ye k h) ", w, g, l, ye, k, h); echo("ClipHook r2 r3 yce xe =", r2, r3, yce, xe); $fn = 20; module jcirc(x,y) { translate([x,y,0]) circle(r=w/2); } module jarc(cx,cy,r,a1=0,a2=tau) { astep = (a2-a1)/6; size = 5*(r+w/2); translate([cx,cy,0]) { intersection() { difference() { circle(r=r+w/2); translate([0,0,-1]) circle(r=r-w/2, h=h+2); } scale(size,size) { for (ai=[0:4]) { echo(" jarc ", a1,a2, astep, ai, rads2degs(a1 + astep*ai) ); rotate(rads2degs(a1 + astep*ai)) { polygon([ [0,0], [1,0], [cos(rads2degs(astep*2)),sin(rads2degs(astep*2))] ]); } } } } } } linear_extrude(height=h) { jcirc(-xc, -yc); jarc(xc, yc, r2, tau*0.25, tau*0.75); } } ClipHook(l=3);