6 led_tip_height_above_crossbar = 70;
8 crossbar_dia = 25; // fixme
10 vert_space_inside = 8;
11 backfront_space_inside = 12;
12 width_space_inside = 10;
14 backfront_mate_size = 25;
15 tower_frontheight = 20;
18 cableclamp_ctie_width = 3 + 0.5;
19 cableclamp_ctie_thick = 2 + 0.5;
21 lidclamp_ctie_width = 4.0 + 0.5;
22 lidclamp_ctie_thick = 2.5 + 0.5;
24 base_ctie_width = 4.0 + 0.5;
25 base_ctie_thick = 2.5 + 0.5;
27 tube_ctie_width = 5 + 0.5;
28 tube_ctie_thick = 3 + 0.5;
32 tower_over_angle = 45;
33 tower_wall_thick = 1.6;
34 tower_base_height = 10;
35 tower_forehead_angle = 30;
41 protrusion_none_frontback = 10;
42 protrusion_slop = 0.5;
49 test_thicks = [9,14,21];
51 module Tests(){ ////toplevel
52 for (thicki=[0:len(test_thicks)-1]) {
53 translate([thicki*test_width-0.5, 0, 0]) {
56 test_thicks[thicki] + led_depth,
58 translate([test_width/2, -1, test_height/2])
60 cylinder(r=led_dia/2, h=led_depth+1, $fn=30);
72 tower_overhang = led_dia * 2.5;
73 tower_width = width_space_inside + tower_wall_thick*2;
75 tower_over_max_y = tower_overhang * sin(tower_over_angle);
76 tower_over_max_z = tower_frontheight + tower_overhang * cos(tower_over_angle);
77 tower_total_max_z = tower_over_max_z + vert_space_inside + led_depth;
78 tower_rearwall_y = -(backfront_space_inside + tower_wall_thick);
79 led_head_y = tower_over_max_y/2;
80 led_head_z = tower_frontheight + tower_overhang*sin(tower_over_angle)/2;
81 backfront_mate_extra = (backfront_mate_size - (-tower_rearwall_y));
83 tower_height_contribution = led_head_z + tower_base_height;
85 base_ctie_anchor_eff = base_ctie_anchor+base_ctie_thick/2;
86 tube_ctie_anchor_eff = tube_ctie_anchor+tube_ctie_thick/2;
88 base_width = 0.7 * crossbar_dia;
89 base_backfront = backfront_mate_extra - tower_rearwall_y;
90 base_height = led_tip_height_above_crossbar - tower_height_contribution;
92 protrusion_frontback = base_backfront - protrusion_none_frontback;
94 echo(tower_height_contribution, base_height);
96 module TowerWallCrossSection(){
97 // generates a 2D shape - a polygon
98 // x is what is going to be -y
99 // y is what is going to be z
101 [0, tower_frontheight],
102 [-tower_over_max_y, tower_over_max_z],
104 + tan(tower_forehead_angle) * (vert_space_inside + led_depth),
106 [-tower_rearwall_y, tower_total_max_z],
107 [-tower_rearwall_y, 0],
108 [-tower_rearwall_y, -tower_base_height],
109 [-backfront_mate_extra, -tower_base_height]],
113 module TowerWallSomeEdge(front){
116 TowerWallCrossSection();
117 translate([front ? 0.10 : -0.10, 0])
118 TowerWallCrossSection();
120 circle(r=tower_wall_thick, $fn=8);
124 module TowerBulkCrossSection(){
126 TowerWallCrossSection();
128 translate([-led_head_y, led_head_z])
129 circle(r = led_depth);
130 TowerWallSomeEdge(true);
131 translate([-50, -50])
137 module TowerRearWallCrossSection(){
139 TowerWallCrossSection();
142 translate([0,-10]) square([100, 10+led_head_z]);
143 TowerWallSomeEdge(false);
145 TowerBulkCrossSection();
151 module TowerCrossSectionDemo(){
152 %TowerWallCrossSection();
153 //TowerBulkCrossSection();
154 TowerRearWallCrossSection();
159 mirror([mir,0,0]) rotate([90,0,-90]) {
160 translate([0,0, tower_width/2-tower_wall_thick])
161 linear_extrude(height=tower_wall_thick) {
162 TowerWallCrossSection();
165 linear_extrude(height=tower_width/2+0.9)
167 TowerBulkCrossSection();
170 TowerWallCrossSection();
171 translate([-30, -30])
172 square([30 + 0.1, 30 + tower_frontheight]);
176 translate([0,0, tower_slot_width/2])
177 linear_extrude(height=(tower_width - tower_slot_width)/2 - 0.2)
178 TowerRearWallCrossSection();
183 translate([0, led_head_y, led_head_z])
184 rotate([90 + led_angle])
186 cylinder(r=led_dia/2, h=led_depth+0.1+10, $fn=30);
189 module Tower(){ ////toplevel
193 // passages for cable ties
197 + cableclamp_ctie_width/2 + lidclamp_ctie_thick/2])
198 cube([50, lidclamp_ctie_width, lidclamp_ctie_thick], center=true);
200 (backfront_mate_extra+tower_rearwall_y)/2,
202 + max(protrusion_size + protrusion_slop + 0.1,
203 base_ctie_anchor_eff)])
204 cube([50, base_ctie_width, base_ctie_thick], center=true);
207 translate([tower_width/4, 20, tower_frontheight/2])
208 cube([cableclamp_ctie_thick,
209 tower_wall_thick*2+1+40,
210 cableclamp_ctie_width],
213 translate([0, tower_rearwall_y, -tower_base_height])
214 BaseRegistrationProtrusion(protrusion_slop);
218 module TowerMainHull(){
219 hull(){ TowerMain(); }
227 sphere(r=lid_wall_thick+lid_slop, $fn=4);
231 sphere(r=lid_slop, $fn=4);
234 translate([-50,-50,led_head_z]) cube([100,100,100]);
238 module LidT(){ ////toplevel
239 rotate([180,0,0]) Lid();
242 module BaseRegistrationProtrusion(extra){
243 size = protrusion_size + extra;
244 translate([0, base_backfront/2, 0]){
246 translate([0,0, -0.5])
247 cube([protrusion_size*2, protrusion_frontback, 1.0], center=true);
248 translate([0, 0, protrusion_size-0.5])
249 cube([0.05, protrusion_frontback-protrusion_size*2, 1.0], center=true);
254 module Base(){ ////toplevel
258 translate([-tower_width/2, 0, 0])
259 cube([tower_width, base_backfront, 0.1]);
260 translate([-base_width/2, 0, base_height])
261 cube([base_width, base_backfront, crossbar_dia/2]);
264 translate([-50, base_backfront/2, -base_ctie_anchor_eff])
265 cube([100, base_ctie_width, base_ctie_thick], center=true);
266 translate([-50, base_backfront/2, -base_height + tube_ctie_anchor_eff])
267 cube([100, tube_ctie_width, tube_ctie_thick], center=true);
268 translate([0, -1, -(base_height + crossbar_dia/2)])
270 cylinder(r=crossbar_dia/2, h=101);
272 BaseRegistrationProtrusion(0.0);
275 module BaseT(){ ////toplevel
276 rotate([90,0,0]) Base();
281 translate([0,0, 25]) Lid();
282 translate([0, tower_rearwall_y, -(tower_base_height+5)]) Base();
285 //TowerCrossSectionDemo();
286 //TowerWallSomeEdge(false);
287 //TowerWallFrontEdge();
292 //BaseRegistrationProtrusion();