chiark / gitweb /
b23ac47c30a2f2faa6578ea9b755467154662221
[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       for (yi=[-1,1]) {
68         translate([xi * (hcentredist/2 + hinnerrad),
69                    houterrad,
70                    yi * (height/2 - roundedgedia / 4 * sqrt(2))])
71           rotate([90,0,0])
72           cylinder(r=roundedgedia/2, h=houterrad*2, $fn=20);
73       }
74     }
75   }
76 }
77
78 module Positive(){
79   difference(){
80     VExtrude()
81       Hoop();
82
83     rotate([90,0,0])
84       translate([0,0,-50])
85       cylinder(r=screwholedia/2, h=100);
86   }
87
88   RoundEdges();
89 }
90
91 module Ribs(){
92   imax = ceil(height*2 / ribheight);
93   for (i=[-imax:imax]) {
94     hull(){
95       translate([-ribdepth/2,
96                  ribheight*i,
97                  0])
98         polygon([[0,          0],
99                  [ribdepth, -ribheight],
100                  [ribdepth, +ribheight]]);
101       translate([50, 0])
102         square([1, height*2], center=true);
103     }
104   }
105 }           
106
107 module Division(cutmore) {
108   mirror([0,0,1]) {
109     translate([0, 0, -cutmore*feedzgap/2]) {
110       translate([-ziglen + -cutmore*feedxgap/2, -100, 0])
111         cube([100, 100, 50]);
112     }
113   }
114   translate([blockwidth/2 - blockoverlapcnr + -cutmore*backxgap/2,
115              -1,
116              -50])
117     cube([100, 100, 100]);
118
119   translate([ziglen + -cutmore*feedxgap/2,
120              -50,
121              -50])
122     cube([100, 51, 100]);
123
124   translate([50,
125              hinnerrad/2 + houterrad/2 + blockdepth/2 + -cutmore*ribsgap/2,
126              0])
127     rotate([-90,0,90])
128     linear_extrude(height=100)
129     Ribs();
130 }
131
132 module SDemo(){
133   //difference(){
134   %  Positive();
135   //  Division(0);
136   //}
137   Division(-1);
138 }
139
140 module A(){
141   difference(){
142     Positive();
143     Division(+1);
144   }
145 }
146
147 module B(){
148   intersection(){
149     Positive();
150     Division(-1);
151   }
152 }
153
154 module Demo(){
155   color("red") A();
156   color("blue") B();
157 }
158
159 //Ribs();
160 //Demo();
161
162 //A();
163 //B();
164 //%Division(+1);
165
166 //Hoop();
167
168 Demo();