still working on the shaft. it now has nice clips.
[Model-M.git] / shift.scad
blob6e8b8ced0ef492408728acb8d1b193c0d364abae
1 //measures are in millimeters
2 AY=23.0;
3 AX=19.0;
4 BY=18.0;
5 BLX=14.5;
6 EZ=11.0;
7 FLZ=14.0;
8 H=12.75;
9 CYL_OFF_Z=70;
10 CYL_DEPTH=0.1;
11 CLIP_X=2;
12 CLIP_Y=0.75;
13 CLIP_H=3*CLIP_Y;
14 CORNER_RADIUS=2;
15 INNER_GUARD_RADIUS=6.5;
16 OUTER_GUARD_RADIUS=7.5;
17 SHAFT_X=8.0;
18 SHAFT_Y=6.0;
19 SHAFT_LENGTH=9.0;
20 SHAFT_THICKNESS=1.0;
21 SHAFT_CLIP_WIDTH=3.0;
22 SHAFT_CLIP_THICKNESS=0.75;
23 SHAFT_CLIP_HEIGHT=2.0;
24 SHAFT_CLIP_SLOPE_DEPTH=1.0;
25 SHAFT_CLIP_ANGLE=45;
26 SHAFT_END_CUTOUT_HEIGHT=1.5;
27 SHAFT_LARGE_SLOT_TO_BASE=1.5;
28 WallThickness=0.75;
29 ClipWidth=2.2;
30 ClipDepth=0.75;
32 //ascfront=FLZ/sqrt(pow(FLZ,2)-pow(H,2));
33 //asctop=(H-EZ)/sqrt(pow(BLX,2)-pow((H-EZ),2));
35 alpha=asin((H-EZ)/BLX);
36 beta=asin(H/FLZ);
37 gamma=90-asin((0.5*(AY-BY))/EZ);
39 module keycap(){
40         scale([AX/(AX+2*CORNER_RADIUS),AY/(AY+2*CORNER_RADIUS),1])
41         translate([CORNER_RADIUS,CORNER_RADIUS,0.01])
42         minkowski(){
43                 difference(){
44                         cube([AX,AY,H]);
45                         rotate(a=gamma,v=[1,0,0]) cube([100,100,100]);
46                         translate([0,AY,0]) rotate(a=90-gamma,v=[1,0,0]) cube([100,100,100]);
47                         translate([0,0,EZ]) rotate(a=-alpha,v=[0,1,0]) translate([-50,0,0]) cube([100,100,100]);
48                         translate([0,AY/2,EZ+CYL_OFF_Z]) rotate(a=90-alpha,v=[0,1,0]) cylinder(h=100,center=true,r=CYL_OFF_Z+CYL_DEPTH,$fa=1);
49                         translate([AX,0,0]) rotate(a=beta-90,v=[0,1,0]) cube([100,100,100]);
50                 }
51                 cylinder(h=0.01,r=CORNER_RADIUS,$fs=0.6);
52                 //rotate(a=90,v=[1,0,0]) cylinder(h=0.01,r=1,$fs=0.3);
53         }
56 module blind_shaft(){
60 module shaft(){
61         translate([0,0,-SHAFT_LENGTH]) difference(){
62                 union(){
63                         difference(){
64                                 intersection(){
65                                         cylinder(h=100,r=SHAFT_X/2,$fs=0.3);
66                                         translate([-SHAFT_X/2,-SHAFT_Y/2,0]) cube([SHAFT_X,SHAFT_Y,100]);
67                                 }
68                                 intersection(){
69                                         cylinder(h=100,r=SHAFT_X/2-SHAFT_THICKNESS,$fs=0.3);
70                                         translate([-SHAFT_X/2+SHAFT_THICKNESS,-SHAFT_Y/2+SHAFT_THICKNESS,0]) cube([SHAFT_X-2*SHAFT_THICKNESS,SHAFT_Y-2*SHAFT_THICKNESS,100]);
71                                 }
72                         }
73                         translate([-SHAFT_CLIP_WIDTH/2, -SHAFT_CLIP_THICKNESS-SHAFT_Y/2,0]) cube([SHAFT_CLIP_WIDTH/2, SHAFT_CLIP_THICKNESS,SHAFT_CLIP_HEIGHT]);
74                         translate([-SHAFT_CLIP_WIDTH/2, SHAFT_Y/2,0]) cube([SHAFT_CLIP_WIDTH/2, SHAFT_CLIP_THICKNESS,SHAFT_CLIP_HEIGHT]);
75                 }
76                 translate([-SHAFT_CLIP_WIDTH/2, -SHAFT_CLIP_THICKNESS-SHAFT_Y/2+SHAFT_CLIP_SLOPE_DEPTH,0]) rotate(a=90+SHAFT_CLIP_ANGLE,v=[1,0,0]) cube([SHAFT_CLIP_WIDTH/2,100,100]);
77                 translate([-SHAFT_CLIP_WIDTH/2, SHAFT_Y/2+SHAFT_CLIP_THICKNESS-SHAFT_CLIP_SLOPE_DEPTH,0]) mirror([0,1,0]) rotate(a=90+SHAFT_CLIP_ANGLE,v=[1,0,0]) cube([SHAFT_CLIP_WIDTH/2,100,100]);
78                 translate([0,-50,0]) cube([100,100,SHAFT_END_CUTOUT_HEIGHT]);
79                 translate([0,-SHAFT_Y/2+SHAFT_THICKNESS,0]) cube([100,SHAFT_Y-SHAFT_THICKNESS*2,SHAFT_LENGTH+SHAFT_LARGE_SLOT_TO_BASE]);
80         }
83 module guard(){
84         difference(){
85                 union(){
86                         cube([1,100,100],center=true);
87                         cube([100,1,100],center=true);
88                         cylinder(r=OUTER_GUARD_RADIUS,h=100);
89                 }
90                 cylinder(r=INNER_GUARD_RADIUS,h=100);
91         }
94 difference(){
95         keycap();
96         difference(){
97                 translate([WallThickness, WallThickness, 0]) scale(v=[1-2*WallThickness/AX, 1-2*WallThickness/AY, 1-WallThickness/H]) keycap();
98                 translate([OUTER_GUARD_RADIUS+WallThickness,AY/2]) guard();
99         }
101 intersection(){
102         union(){
103                 translate([WallThickness, WallThickness, 0]) scale(v=[1-2*WallThickness/AX, 1-2*WallThickness/AY, 1-WallThickness/H]) keycap();
104                 translate([-50,-50,-99.9]) cube([100,100,100]);
105         }
106         translate([OUTER_GUARD_RADIUS+WallThickness,AY/2]) union(){
107                 shaft();
108         }