// -*- C -*- led_dia = 5 + 0.6; led_depth = 5; led_tip_z = 70; led_angle = -60; vert_space_inside = 8; backfront_space_inside = 12; backfront_mate_size = 25; tower_frontheight = 20; tower_width = 18; tower_slot_width = 3; // tuning tower_over_angle = 45; tower_wall_thick = 1.6; tower_base_height = 10; tower_forehead_angle = 30; //--- tests --- test_width = 24; test_height = 24; test_thicks = [9,14,21]; module Tests(){ ////toplevel for (thicki=[0:len(test_thicks)-1]) { translate([thicki*test_width-0.5, 0, 0]) { difference(){ cube([test_width, test_thicks[thicki] + led_depth, test_height]); translate([test_width/2, -1, test_height/2]) rotate([-90,0,0]) cylinder(r=led_dia/2, h=led_depth+1, $fn=30); } } } } //Tests(); //--- real thing --- tower_overhang = led_dia * 2.5; tower_over_max_y = tower_overhang * sin(tower_over_angle); tower_over_max_z = tower_frontheight + tower_overhang * cos(tower_over_angle); tower_total_max_z = tower_over_max_z + vert_space_inside + led_depth; tower_rearwall_y = -(backfront_space_inside + tower_wall_thick); led_head_y = tower_over_max_y/2; led_head_z = tower_frontheight + tower_overhang*sin(tower_over_angle)/2; backfront_mate_extra = (backfront_mate_size - (-tower_rearwall_y)); module TowerWallCrossSection(){ // generates a 2D shape - a polygon // x is what is going to be -y // y is what is going to be z polygon([[0, 0], [0, tower_frontheight], [-tower_over_max_y, tower_over_max_z], [-tower_over_max_y + tan(tower_forehead_angle) * (vert_space_inside + led_depth), tower_total_max_z], [-tower_rearwall_y, tower_total_max_z], [-tower_rearwall_y, 0], [-tower_rearwall_y, -tower_base_height], [-backfront_mate_extra, -tower_base_height]], convexity=5); } module TowerWallSomeEdge(front){ minkowski(){ difference(){ TowerWallCrossSection(); translate([front ? 0.10 : -0.10, 0]) TowerWallCrossSection(); } circle(r=tower_wall_thick, $fn=8); } } module TowerBulkCrossSection(){ intersection(){ TowerWallCrossSection(); union(){ translate([-led_head_y, led_head_z]) circle(r = led_depth); TowerWallSomeEdge(true); translate([-50, -50]) square([100, 50]); } } } module TowerRearWallCrossSection(){ intersection(){ TowerWallCrossSection(); union(){ intersection(){ translate([0,-10]) square([100, 10+led_head_z]); TowerWallSomeEdge(false); } TowerBulkCrossSection(); } } } module TowerCrossSectionDemo(){ %TowerWallCrossSection(); //TowerBulkCrossSection(); TowerRearWallCrossSection(); } module TowerMain(){ for (mir=[0,1]) mirror([mir,0,0]) rotate([90,0,-90]) { translate([0,0, tower_width/2-tower_wall_thick]) linear_extrude(height=tower_wall_thick) TowerWallCrossSection(); translate([0,0,-1]) linear_extrude(height=tower_width/2+0.9) TowerBulkCrossSection(); translate([0,0, tower_slot_width/2]) linear_extrude(height=(tower_width - tower_slot_width)/2 - 0.2) TowerRearWallCrossSection(); } } module LedHole(){ translate([0, led_head_y, led_head_z]) rotate([90 + led_angle]) translate([0,0,-10]) cylinder(r=led_dia/2, h=led_depth+0.1+10, $fn=30); } module Tower(){ difference(){ TowerMain(); LedHole(); } } //TowerCrossSectionDemo(); //TowerWallSomeEdge(false); //TowerWallFrontEdge(); Tower();