chiark / gitweb /
cliphook wip - causes openscad to fail an assertion
[reprap-play.git] / cliphook.scad
1
2 function ClipHook_r2(w,g,l,ye,k) = w/2 + g + w/2;
3 function ClipHook_r3(w,g,l,ye,k) = k * (ClipHook_r2(w,g,l,ye,k) + w + g);
4 function ClipHook_yd(w,g,l,ye,k) = g/2 + w + g + w/2 - ClipHook_r3(w,g,l,ye,k);
5 function ClipHook_xe(w,g,l,ye,k) =
6         l*1.5 + w +
7         sqrt(pow( ClipHook_r3(w,g,l,ye,k),      2) -
8              pow( ClipHook_yd(w,g,l,ye,k) + ye, 2));
9
10 module ClipHook_2D(w,g,l,ye,k,h) {
11   r2 =  ClipHook_r2(w,g,l,ye,k);
12   r3 =  ClipHook_r3(w,g,l,ye,k);
13   yd =  ClipHook_yd(w,g,l,ye,k);
14   xe =  ClipHook_xe(w,g,l,ye,k);
15
16   xd = l*1.5 + w;
17   xc = -l/2;
18   yc = g/w + w/2;
19
20   alpha = atan2((xe-xd)/r3, (ye-yd)/r3);
21
22   echo("ClipHook(w g l ye k h) ", w, g, l, ye, k, h);
23   echo("ClipHook r2 r3 xd yd xe =", r2,r3, xd,yd, xe);
24
25   $fn = 20;
26
27   module jcirc(x,y) { translate([x,y,0]) circle(r=w/2); }
28   module jbox(y,x1,x2) { translate([x1,y-w/2,0]) square(size=[x2-x1, w]); }
29   module jarc(cx,cy,r,a1=0,a2=360) {
30     astep = (a2-a1)/6;
31     size = 5*(r+w/2);
32     translate([cx,cy,0]) {
33       intersection() {
34         difference() {
35                 circle(r=r+w/2);
36                 translate([0,0,-1])
37                         circle(r=r-w/2, h=h+2);
38         }
39         scale(size) {
40           for (ai=[0:4]) {
41             echo(" jarc ", a1,a2, astep, ai, a1 + astep*ai );
42             rotate(a1 + astep*ai) {
43               polygon([ [0,0], [1,0],
44                         [cos(astep*2),sin(astep*2)] ]);
45             }
46           }
47         }
48       }
49     }
50   }
51
52
53   jcirc(-xc, -yc);
54   jbox(-yc, xc, -xc);
55   jarc(xc, yc, r2, 90, 270);
56   jbox(yc+r2, xc, xd);
57   jarc(xd, yd, r3, 90-alpha, 90);
58   jcirc(xe,ye);
59 }
60
61 module ClipHook(w=1.2, g=0.2, l=0.0, ye=0, k=2.0, h=3.5, demo=false) {
62   linear_extrude(height=h)
63     ClipHook_2D(w,g,l,ye,k);
64   if (demo)
65     %linear_extrude(height=h)
66       translate([l+w,0,0]) rotate(180) ClipHook_2D(w,g,l,ye,k);
67 }
68
69 ClipHook(l=3, ye=-3, k=1, demo=true);