chiark / gitweb /
svg-prep-dxf: copy from private repo f0cc4e6f4db54b4c59660d46330ecb3e735ce009
[reprap-play.git] / cliphook.scad
1 // -*- C -*-
2 //
3 // cliphook.scad
4 //
5 // 3D design for a small clippy hook
6 // Copyright 2012,2016 Ian Jackson
7 //
8 // This work is free software: you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation, either version 3 of the License, or
11 // (at your option) any later version.
12 //
13 // This work is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this work.  If not, see <http://www.gnu.org/licenses/>.
20
21 function ClipHook_r2(w,g,l,ye,k) = w/2 + g + w/2;
22 function ClipHook_r3(w,g,l,ye,k) = k * (ClipHook_r2(w,g,l,ye,k) + w + g);
23 function ClipHook_yd(w,g,l,ye,k) = g/2 + w + g + w/2 - ClipHook_r3(w,g,l,ye,k);
24 function ClipHook_xe(w,g,l,ye,k) =
25         l*1.5 + w +
26         sqrt(pow( ClipHook_r3(w,g,l,ye,k),      2) -
27              pow( ClipHook_yd(w,g,l,ye,k) - ye, 2));
28
29 module FlatArc(cx,cy,r1,r2,a1,a2=361,$fn=$fn) {
30   astep = (a2-a1)/6;
31   size = 5*(r2/2);
32   translate([cx,cy,0]) {
33     intersection() {
34       difference() {
35         circle(r=r2);
36         translate([0,0,-1])
37           circle(r=r1);
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 module ClipHook_2D(w,g,l,ye,k,h) {
53   r2 =  ClipHook_r2(w,g,l,ye,k);
54   r3 =  ClipHook_r3(w,g,l,ye,k);
55   yd =  ClipHook_yd(w,g,l,ye,k);
56   xe =  ClipHook_xe(w,g,l,ye,k);
57
58   xd = l*1.5 + w;
59   xc = -l/2;
60   yc = g/2 + w/2;
61
62   alpha = atan2((xe-xd)/r3, (ye-yd)/r3);
63
64   echo("ClipHook(w g l ye k h) ", w, g, l, ye, k, h);
65   echo("ClipHook r2 r3 xd yd xe =", r2,r3, xd,yd, xe);
66
67   $fn = 20;
68
69   module jcirc(x,y) { translate([x,y,0]) circle(r=w/2); }
70   module jbox(y,x1,x2) { translate([x1,y-w/2,0]) square(size=[x2-x1, w]); }
71   module jarc(cx,cy,r,a1=0,a2=360) { FlatArc(cx,cy,r-w/2,r+w/2,a1,a2); }
72
73   jcirc(-xc, -yc);
74   jbox(-yc, xc, -xc);
75   jarc(xc, yc, r2, 90, 270);
76   jbox(yc+r2, xc, xd);
77   jarc(xd, yd, r3, 90-alpha, 90);
78   jcirc(xe,ye);
79 }
80
81 module ClipHook(w=1.2, g=0.2, l=0.0, ye=0, k=2.0, h=3.5, demo=false,
82                 cupcaph=0, cupgapg=0) {
83   difference() {
84     linear_extrude(height=h)
85       ClipHook_2D(w,g,l,ye,k);
86     if (cupcapg != 0) {
87       translate([-g+0.01,-(w+g),h-cupcapg])
88       cube([w,(w+g),cupcaph+1]);
89     }
90   }
91   if (cupcaph != 0) {
92     translate([-l/2, g/2+w/2, h-0.01])
93       intersection() {
94         cylinder(r=ClipHook_r2(w,g,l,ye,k)+w*0.4, h=cupcaph, $fn=16);
95         translate([-50-g,-50,-1]) cube([50,100,h+2]);
96       }
97   }
98 }
99
100 if (ClipHook_demo) {
101   ClipHook(l=0, k=1, cupcaph=1, cupcapg=0.4);
102   %translate([l+w,0,0]) rotate(180) ClipHook(l=0, k=1, cupcaph=1, cupcapg=0.4);
103 }