eps = 0.01; infty = 100; wall = 1.5; led_d = 10 + 0.5; led_angle = 10; led_depth = 4; led_x = led_d/2+0.75; body_x = led_d + 2*led_x + 15; body_d = 14; top_off = body_d*tan(led_angle); body_y = led_d + 2*top_off + 5*wall; base_w = led_d + 4*wall; screw_d = 3.8; screw_head = 8; // screw_y = led_d/2+screw_head/2+wall; screw_x = body_x/2 +wall + screw_head/2; screw_wall = 2.5; cable_w = 7; cable_h = screw_wall; module body() { hull() { for (i = [-1, 1]) translate([i*led_x, 0, 0]) cylinder(r = base_w/2, h = eps); // translate([-led_x-led_d/2-wall, -led_d/2-wall, 0]) // cube([2*led_x + led_d + 2*wall, led_d+2*wall, eps]); translate([-body_x/2, -body_y/2, body_d-screw_wall]) cube([body_x, body_y, screw_wall]); for (i = [-1, 1]) scale([i, 1, 1]) { translate([screw_x-screw_head/2, -screw_head/2-wall, body_d-screw_wall]) cube([screw_head, screw_head+2*wall, screw_wall]); translate([screw_x-screw_head/2, -screw_head/2-wall, 0]) cube([screw_head/2, screw_head+2*wall, eps]); } } }; module main_hole() { hull() { for (i = [-1, 1]) rotate([led_angle, 0, 0]) { translate([i*led_x, 0, led_depth]) cylinder(r = led_d/2+wall/2, h = eps); } translate([-body_x/2+wall, -body_y/2+wall, body_d-screw_wall]) cube([body_x-2*wall, body_y-2*wall, screw_wall+eps]); } for (i = [-1, 1]) rotate([led_angle, 0, 0]) translate([i*led_x, 0, led_depth]) cylinder(r = led_d/2+wall/2, h = infty); } difference() { body(); // LED holes for (i = [-1, 1]) rotate([led_angle, 0, 0]) translate([i*led_x, 0, -infty/2]) cylinder(r = led_d/2, h = infty); // main hole difference() { main_hole(); // translate([-screw_head/2-wall, screw_y-screw_head/2-wall, 0]) // cube([screw_head+2*wall, screw_head+2*wall, infty]); }; for (i = [-1, 1]) scale([i, 1, 1]) { // screw head hole translate([screw_x-screw_head/2, -screw_head/2, -eps]) cube([screw_head+wall, screw_head, body_d-screw_wall]); // screw hole translate([screw_x-screw_d/2, -screw_head/2, -eps]) cube([screw_d, screw_head, infty]); } // cable hole translate([-led_x, 0, 0]) rotate([0, 0, 30]) translate([-infty, -cable_w/2, body_d-cable_h]) cube([infty, cable_w, cable_h+eps]); }