--- /dev/null
+
+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);