summaryrefslogtreecommitdiff
path: root/multiswitch.scad
Unidiff
Diffstat (limited to 'multiswitch.scad') (more/less context) (ignore whitespace changes)
-rw-r--r--multiswitch.scad4
1 files changed, 3 insertions, 1 deletions
diff --git a/multiswitch.scad b/multiswitch.scad
index 2b909a9..f58b7bd 100644
--- a/multiswitch.scad
+++ b/multiswitch.scad
@@ -12,97 +12,99 @@ module multiswitch(
12 minshell = 2*extrusion_width, 12 minshell = 2*extrusion_width,
13 shell = 5*extrusion_width, 13 shell = 5*extrusion_width,
14 pf = pushfit_embeddest, 14 pf = pushfit_embeddest,
15 15
16 debug = 0, // how many inputs -1 the debug cutout spans 16 debug = 0, // how many inputs -1 the debug cutout spans
17 draft = draft, 17 draft = draft,
18 print = true, 18 print = true,
19 19
20 liner_d_tolerance=.2 20 liner_d_tolerance=.2
21) { 21) {
22 fnd = 4*PI; fnr = 2*fnd; 22 fnd = 4*PI; fnr = 2*fnd;
23 23
24 pushfit_d = pf_d(pf); 24 pushfit_d = pf_d(pf);
25 pushfit_h = pf_h(pf); 25 pushfit_h = pf_h(pf);
26 26
27 angular_step = 360/inputs; 27 angular_step = 360/inputs;
28 lod = liner_od+liner_d_tolerance; // effective liner diameter 28 lod = liner_od+liner_d_tolerance; // effective liner diameter
29 29
30 sinsin = sin(angle)*sin(angular_step/2); 30 sinsin = sin(angle)*sin(angular_step/2);
31 function l_to(d) = d*cos(asin(sinsin))/sinsin; 31 function l_to(d) = d*cos(asin(sinsin))/sinsin;
32 l_output = lod; 32 l_output = lod;
33 l_input = l_to((pushfit_d+minshell)/2); 33 l_input = l_to((pushfit_d+minshell)/2);
34 l_fork = l_to(liner_id/2); 34 l_fork = l_to(liner_id/2);
35 l_narrow = l_to(lod/2+minshell); 35 l_narrow = l_to(lod/2+minshell);
36 36
37 module forinputs() { 37 module forinputs() {
38 for(zr=[0:angular_step:359]) rotate([0,0,zr]) rotate([0,angle,0]) children(); 38 for(zr=[0:angular_step:359]) rotate([0,0,zr]) rotate([0,angle,0]) children();
39 }//forinputs module 39 }//forinputs module
40 module foroutput() { 40 module foroutput() {
41 rotate([180,0,0]) children(); 41 rotate([180,0,0]) children();
42 } 42 }
43 43
44 module laydown() { 44 module laydown() {
45 r = pushfit_d/2+shell; 45 r = pushfit_d/2+shell;
46 h_bottom = l_output+pushfit_h; 46 h_bottom = l_output+pushfit_h;
47 /* The top point on the cylinder that will touch the bed */ 47 /* The top point on the cylinder that will touch the bed */
48 x0 = r*cos(angular_step/2); 48 x0 = r*cos(angular_step/2);
49 y0 = r*sin(angular_step/2); 49 y0 = r*sin(angular_step/2);
50 z0 = l_input+pushfit_h; 50 z0 = l_input+pushfit_h;
51 /* The same point after rotation by "angle" around Y axis */ 51 /* The same point after rotation by "angle" around Y axis */
52 x1 = z0*sin(angle)+x0*cos(angle); 52 x1 = z0*sin(angle)+x0*cos(angle);
53 y1 = y0; 53 y1 = y0;
54 z1 = z0*cos(angle)-x0*sin(angle); 54 z1 = z0*cos(angle)-x0*sin(angle);
55 ax1 = atan(y1/x1); 55 ax1 = atan(y1/x1);
56 /* And its x-coordinate after final "angular_step/2" Z-rotation */ 56 /* And its x-coordinate after final "angular_step/2" Z-rotation */
57 ax2 = ax1-angular_step/2; 57 ax2 = ax1-angular_step/2;
58 x2 = x1*cos(ax2)/cos(ax1); 58 x2 = x1*cos(ax2)/cos(ax1);
59 laydown_angle = atan((x2-r)/(z1+h_bottom)); 59 laydown_angle = atan((x2-r)/(z1+h_bottom));
60 rotate([90-laydown_angle,0,0]) 60 rotate([90-laydown_angle,0,0])
61 translate([0,r,h_bottom]) 61 translate([0,r,h_bottom])
62 rotate([0,0,angular_step/2-90]) 62 rotate([0,0,angular_step/2-90])
63 children(); 63 children();
64 } 64 }
65 module finalize() { 65 module finalize() {
66 if(print) laydown() children(); 66 if(print) laydown() children();
67 else children(); 67 else children();
68 } 68 }
69 69
70 finalize() difference() { 70 finalize() difference() {
71 hull() { 71 hull() {
72 forinputs() 72 forinputs()
73 translate([0,0,l_input+pushfit_h]) mirror([0,0,1]) 73 translate([0,0,l_input+pushfit_h]) mirror([0,0,1])
74 cylinder(d=pushfit_d+shell*2,h=epsilon,$fn=pushfit_d*fnd); 74 cylinder(d=pushfit_d+shell*2,h=epsilon,$fn=pushfit_d*fnd);
75 foroutput() 75 foroutput()
76 translate([0,0,l_output+pushfit_h]) { 76 translate([0,0,l_output+pushfit_h]) {
77 cylinder(d=pushfit_d+shell*2,h=epsilon,$fn=pushfit_d*fnd); 77 cylinder(d=pushfit_d+shell*2,h=epsilon,$fn=pushfit_d*fnd);
78 } 78 }
79 } 79 }
80 forinputs() { 80 forinputs() {
81 translate([0,0,l_input]) pushfit(pf,draft=draft); 81 translate([0,0,l_input]) pushfit(pf,draft=draft);
82 translate([0,0,l_narrow]) { 82 translate([0,0,l_narrow]) {
83 cylinder(d=lod,h=l_input+1-l_narrow,$fn=lod*fnd); 83 cylinder(d=lod,h=l_input+1-l_narrow,$fn=lod*fnd);
84 mirror([0,0,1]) translate([0,0,-epsilon]) 84 mirror([0,0,1]) translate([0,0,-epsilon])
85 cylinder(d1=(liner_id+lod)/2,d2=liner_id,h=liner_id,$fn=lod*fnd); 85 cylinder(d1=(liner_id+lod)/2,d2=liner_id,h=liner_id,$fn=lod*fnd);
86 } 86 }
87 cylinder(d=liner_id,h=l_input+epsilon,$fn=liner_id*fnd); 87 cylinder(d=liner_id,h=l_input+epsilon,$fn=liner_id*fnd);
88 } 88 }
89 foroutput() { 89 foroutput() {
90 translate([0,0,l_output]) pushfit(pf,draft=draft); 90 translate([0,0,l_output]) pushfit(pf,draft=draft);
91 cylinder(d=lod,h=l_output+1,$fn=lod*fnd); 91 cylinder(d=lod,h=l_output+1,$fn=lod*fnd);
92 } 92 }
93 hull() { 93 hull() {
94 forinputs() 94 forinputs()
95 translate([0,0,l_fork]) cylinder(d=liner_id,h=epsilon,$fn=liner_id*fnd); 95 translate([0,0,l_fork]) cylinder(d=liner_id,h=epsilon,$fn=liner_id*fnd);
96 foroutput() 96 foroutput()
97 cylinder(d=liner_id,h=epsilon,$fn=liner_id*fnd); 97 cylinder(d=liner_id,h=epsilon,$fn=liner_id*fnd);
98 } 98 }
99 if(debug) { 99 if(debug) {
100 translate([0,0,-20/*TODO:*/]) 100 translate([0,0,-20/*TODO:*/])
101 rotate_extrude(angle=angular_step*debug) 101 rotate_extrude(angle=angular_step*debug)
102 square([50,100]/*TODO:*/); 102 square([50,100]/*TODO:*/);
103 } 103 }
104 } 104 }
105 105
106} 106}
107 107
108multiswitch(debug=2,print=false); 108
109//CUSTOMIZERCUTOFF
110multiswitch(debug=1,print=false,inputs=2);