1
+ include < ../../variables.scad>
2
+ use < ../../lib/Round- Anything/polyround.scad>
3
+
4
+ use < ../../lib/utils.scad>
5
+
6
+
7
+ $ fn = 60 ;
8
+ z = [0 , 0 , 1 ];
9
+ y = [0 , 1 , 0 ];
10
+ x = [1 , 0 , 0 ];
11
+ cz = 1.2 ;
12
+ h = 15 ;
13
+ cxy = 13.7 ;
14
+ size = [cxy, cxy, h];
15
+ z1 = - h / 2 ;
16
+ sizeb = [cxy + 1 , cxy, cz];
17
+ z2 = - cz * 1.5 ;
18
+ sizet = [cxy + 2 , cxy + 2 , 4 ];
19
+ sizef = [cxy + 5 , cxy + 5 , h];
20
+ z4 = - sizef[2 ] / 2 ;
21
+ SMALLEST_POSSIBLE = 0.01 ;
22
+
23
+ // if ($preview) import("/home/paulg/Downloads/kailh_low.stl");
24
+ module hole() {
25
+ translate (z1 * z)cube (size, center = true );
26
+ translate (z2 * z)cube (sizeb, center = true );
27
+ translate (2 * z)cube (sizet, center = true );
28
+ }
29
+
30
+ module handlebar()
31
+ {
32
+ translate ((50 ) / 2 * y - 18.5 * z)rotate ([90 , 0 , 0 ])cylinder (d = 25.4 , h = 50 );
33
+ }
34
+
35
+ module cable() {
36
+ hull () {
37
+ translate ([4.5 , 0 , - 5 ])rotate ([90 , 0 , 0 ])cylinder (d = 4 , h = 20 );
38
+ translate ([4.5 , 0 , - 12 ])rotate ([90 , 0 , 0 ])cylinder (d = 4 , h = 20 );
39
+ }
40
+ }
41
+
42
+ module hookprofile() {
43
+ hull ()for (i = [- 1 , 1 ])translate ([0 , i * 3 ])circle(d = 2.5 );
44
+ }
45
+
46
+ module support(zoffset) {
47
+ hull () {
48
+ translate ([- 1.25 , 0 , - 0.2 ])linear_extrude(0.2 )hookprofile();
49
+ translate ([2.5 , 0 , - 0.2 ])linear_extrude(0.2 )hookprofile();
50
+ }
51
+ hull () {
52
+ translate ([2.5 , 0 , - 0.01 ])linear_extrude(0.01 )hookprofile();
53
+ translate ([2.5 , 0 , - zoffset + 2.5 ])linear_extrude(0.2 )hookprofile();
54
+ translate ([2.2 , 0 , - zoffset + 2.5 ])rotate ([0 , 90 , 0 ])linear_extrude(0.6 )hookprofile();
55
+ }
56
+ }
57
+ module hookbase(zoffset) {
58
+ translate (- zoffset * z)rotate (- [90 , 0 , 0 ]) {
59
+ rotate_extrude(angle = 180 ) translate ([2.5 , 0 ]) hookprofile();
60
+ hull () {
61
+ translate ([2.2 , 0 , 0 ])rotate ([90 , 0 , 90 ])linear_extrude(0.6 )hookprofile();
62
+ translate ([2.5 , 0 , 0 ])rotate ([90 , 0 , 00 ])linear_extrude(0.2 )hookprofile();
63
+ }
64
+ }
65
+ support(zoffset);
66
+
67
+ }
68
+
69
+
70
+
71
+ module button(detail = true) {
72
+ difference () {
73
+ union () {
74
+ translate (z4 * z)cube (sizef, center = true );
75
+ if (detail) {
76
+ translate (0.5 * [cxy + 5 + 2.5 , 0 , 0 ])hookbase(6 );
77
+ mirror ([1 , 0 , 0 ])translate (0.5 * [cxy + 5 + 2.5 , 0 , 0 ])hookbase(6 );
78
+ }
79
+ }
80
+
81
+ if (detail) {
82
+ hole();
83
+ handlebar();
84
+ cable();
85
+ }
86
+ }
87
+
88
+ }
89
+
90
+ button();
91
+
92
+
93
+
94
+
95
+ module buttoncutter(spacing = .5) {
96
+ translate (- (spacing + 3.5 ) * z)minkowski () {
97
+ cube (spacing, center = true );
98
+ union () {button(detail = false );
99
+ hull () {
100
+ linear_extrude(1 )translate ((- cxy / 2 - 1 ) * (x + y))square([cxy + 2 , cxy + 2 ]);
101
+ translate (z * 2.5 )linear_extrude(1 )translate ((- cxy / 2 ) * (x + y))square([cxy, cxy]);
102
+ }
103
+ }
104
+ }
105
+ }
106
+
107
+ module roundedsquare(sizes, r = 2) {
108
+ points = [[0 , 0 , r],
109
+ [sizes[0 ], 0 , r],
110
+ [sizes[0 ], sizes[1 ], r],
111
+ [0 , sizes[1 ], r]
112
+ ];
113
+ echo (points);
114
+ translate (0.5 * [- sizes[0 ], - sizes[1 ]])polygon(polyRound(points));
115
+ }
116
+
117
+
118
+ module buttontop(wall = 3) {
119
+ translate (- 6 * z)rounded_cherry_stem(6 , 0.2 , 4 );
120
+ translate (- 6 * z)rounded_cherry_stem(6 , 0.2 , 4 );
121
+ difference () {
122
+ hull () {
123
+ translate (- z)linear_extrude(1 )roundedsquare([cxy + 3 , cxy + 3 ]);
124
+ translate (- 5 * z)linear_extrude(1 )translate ((- (cxy + 5 + wall) / 2 ) * (x + y))square([cxy + 5 + wall, cxy +
125
+ 5 + wall]);
126
+ translate (- 11 * z)linear_extrude(1 )translate ((- (cxy + 5 + wall) / 2 ) * (x + y))square([cxy + 5 + wall, cxy +
127
+ 5 + wall]);
128
+
129
+ }
130
+ translate (- z)buttoncutter();
131
+ translate (- 4 * z)cable();
132
+ }
133
+ }
134
+
135
+ translate (- 30 * y)buttontop();
0 commit comments