infty = 200; eps = 0.05; tube_d = 31.8; tube_d1 = 31.8; body_w = 10; body_h = 45; wall = 2; led_d = 3 + 1; zip_w = 3.5; zip_h = 2.5; top_w = 10+2*wall; top_led_h = body_h-14; led_angle_y = 30; led_angle_z = 30; cable_w = 6; cable_h = 3; module body() { hull() { cylinder(r = tube_d/2 + wall, h = body_w); translate([body_h + tube_d/2, 0, 0]) scale([0.75, 1, 1]) cylinder(r = top_w/2, h = body_w); } } module chamber() { difference() { hull() { translate([0, 0, wall]) cylinder(r = tube_d/2, h = body_w); translate([tube_d/2+body_h-eps, 0, wall]) scale([0.75, 1, 1]) cylinder(r = top_w/2-wall, h = body_w); } // bottom part translate([0, -tube_d/2-wall-eps, 0]) cube([tube_d/2+wall+zip_h/2, tube_d+2*wall, body_w+2*wall]); // top covered part intersection() { translate([top_led_h + tube_d/2, -tube_d/2, body_w-wall]) cube([infty, tube_d, 2*wall]); translate([top_led_h + tube_d/2, 0, 0]) rotate([0, led_angle_y, -led_angle_z]) translate([0, -infty/2, 0]) cube(infty); } // wall with hole for LED translate([top_led_h + tube_d/2, 0, 0]) rotate([0, led_angle_y, -led_angle_z]) translate([0, 3, 0]) cube([wall, infty, infty]); } } module holder() { difference() { body(); // cut off the bottom part translate([-infty+tube_d/4, -infty/2, -infty/2]) cube(infty); // main tube translate([0, 0, -eps]) cylinder(r1 = tube_d1/2, r2 = tube_d/2, h = body_w + 2*eps, $fn = 100); // zip tie hole scale([1, 1.05, 1]) translate([0, 0, body_w/2 - zip_w/2]) rotate_extrude(convexity = 10) { translate([tube_d/2 + wall, 0, 0]) square(size = [zip_h, zip_w]); } chamber(); // front hole difference() { translate([tube_d/2 + wall + zip_h/2, -5, wall]) cube([top_led_h + tube_d, tube_d, body_w]); translate([top_led_h + tube_d/2, 0, 0]) rotate([0, led_angle_y, -led_angle_z]) translate([0, -infty/2, 0]) cube(infty); } // LED hole translate([tube_d/2+top_led_h+2*wall+body_w*sin(led_angle_y), 1.5*wall, body_w/2-0.5]) rotate([0, led_angle_y, -led_angle_z]) rotate([0, -90, 0]) cylinder(r = led_d/2, h = 10, $fn = 6); // cable hole hull() { translate([tube_d/2 + wall + zip_h/2, -10, body_w/2-zip_w/2]) cube([cable_h, cable_w, eps]); translate([tube_d/2, -10, -eps]) cube([cable_h, cable_w, eps]); } } } scale([-1, 1, 1]) // mirror it holder();