chiark / gitweb /
maglite-holder: Bracket as toplevel
[reprap-play.git] / pull-cord-keeper.scad
1 // -*- C -*-
2
3 hoopthick = 3;
4
5 hinnerrad = 15;
6 houterrad = hinnerrad + hoopthick;
7 hcentredist = 10;
8
9 blockdepth = 5;
10 blockwidth = hcentredist*2 + 6;
11
12 height = 20;
13
14 roundedgedia = 7.5;
15
16 ziglen = hcentredist/2;
17
18 feedxgap = 5;
19 feedzgap = 5;
20 ribsgap = 1;
21
22 ribdepth = 3;
23 ribheight = 4;
24
25 backxgap = 1;
26
27 blockoverlapcnr = 5;
28
29 screwholedia = 4 + 0.5;
30
31 module Oval(centredist, rad) {
32   hull() {
33     translate([-centredist/2,0,0]) circle(r=rad);
34     translate([+centredist/2,0,0]) circle(r=rad);
35   }
36 }  
37
38 module VExtrude(){
39   translate([0,0, -height/2])
40     linear_extrude(height=20)
41     children(0);
42 }
43
44 module OuterOval(){
45   Oval(hcentredist, houterrad);
46 }
47
48 module Hoop(){
49   difference(){
50     hull(){
51       OuterOval();
52       translate([0, (blockdepth + hoopthick)/2 + hinnerrad])
53         square([blockwidth,
54                 blockdepth + hoopthick],
55                center=true);
56     }
57     Oval(hcentredist, hinnerrad);
58   }
59 }
60
61 module RoundEdges(){
62   intersection(){
63     VExtrude()
64       OuterOval();
65
66     for (xi=[-1,1]) {
67       hull(){
68         for (yi=[-1,1]) {
69           translate([xi * (hcentredist/2 + hinnerrad),
70                      houterrad,
71                      yi * (height/2 - roundedgedia / 4 * sqrt(2))])
72             rotate([90,0,0])
73             cylinder(r=roundedgedia/2, h=houterrad*2, $fn=20);
74         }
75       }
76     }
77   }
78 }
79
80 module Positive(){
81   difference(){
82     VExtrude()
83       Hoop();
84
85     rotate([90,0,0])
86       translate([0,0,-50])
87       cylinder(r=screwholedia/2, h=100);
88   }
89
90   RoundEdges();
91 }
92
93 module Ribs(){
94   imax = ceil(height*2 / ribheight);
95   for (i=[-imax:imax]) {
96     hull(){
97       translate([-ribdepth/2,
98                  ribheight*i,
99                  0])
100         polygon([[0,          0],
101                  [ribdepth, -ribheight],
102                  [ribdepth, +ribheight]]);
103       translate([50, 0])
104         square([1, height*2], center=true);
105     }
106   }
107 }           
108
109 module Division(cutmore) {
110   mirror([0,0,1]) {
111     translate([0, 0, -cutmore*feedzgap/2]) {
112       translate([-ziglen + -cutmore*feedxgap/2, -100, 0])
113         cube([100, 100, 50]);
114     }
115   }
116   translate([blockwidth/2 - blockoverlapcnr + -cutmore*backxgap/2,
117              -1,
118              -50])
119     cube([100, 100, 100]);
120
121   translate([ziglen + -cutmore*feedxgap/2,
122              -50,
123              -50])
124     cube([100, 51, 100]);
125
126   translate([50,
127              hinnerrad/2 + houterrad/2 + blockdepth/2 + -cutmore*ribsgap/2,
128              0])
129     rotate([-90,0,90])
130     linear_extrude(height=100)
131     Ribs();
132 }
133
134 module SDemo(){
135   //difference(){
136   %  Positive();
137   //  Division(0);
138   //}
139   Division(-1);
140 }
141
142 module A(){
143   difference(){
144     Positive();
145     Division(+1);
146   }
147 }
148
149 module B(){
150   intersection(){
151     Positive();
152     Division(-1);
153   }
154 }
155
156 module Demo(){
157   color("red") A();
158   color("blue") B();
159 }
160
161 module APrint(){ ////toplevel
162   rotate([0,180,0])
163     A();
164 }
165
166 module BPrint(){ ////toplevel
167   B();
168 }
169
170 module Kit(){ ////toplevel
171   translate([0, hinnerrad, 0])
172     APrint();
173   rotate([0,0,180])
174     BPrint();
175 }
176
177 //Ribs();
178 //Demo();
179
180 //A();
181 //B();
182 //%Division(+1);
183
184 //Hoop();
185
186 //Demo();
187 //BPrint();
188
189 //Kit();