$fn = 64; // --- Parameters --- // Dimensions for the USB hub pocket hub_width = 35; hub_depth = 18; hub_height = 60; // General dimensions torch_height = 130; wall_plate_thickness = 5; cable_hole_diameter = 12; // Recommended print orientation: Lay flat on the back surface // --- Main Assembly --- difference() { union() { // Wall Mount Plate (Pill shape) hull() { translate([0, -wall_plate_thickness, -20]) rotate([-90, 0, 0]) cylinder(h=wall_plate_thickness, d=40); translate([0, -wall_plate_thickness, 150]) rotate([-90, 0, 0]) cylinder(h=wall_plate_thickness, d=40); } // Torch Body // Lower handle cylinder(h=torch_height * 0.7, r1=18, r2=25); // Upper flared head translate([0, 0, torch_height * 0.7]) cylinder(h=torch_height * 0.3, r1=25, r2=40); // Decorative Rings cylinder(h=4, r=21); translate([0, 0, torch_height * 0.7 - 4]) cylinder(h=4, r=28); translate([0, 0, torch_height - 4]) cylinder(h=4, r=43); } // Global back cut // Ensures the entire back is perfectly flush for wall mounting translate([-100, -100 - wall_plate_thickness, -50]) cube([200, 100, torch_height + 100]); // USB Hub Pocket // Shifted forward (Y=10) to stay centered within the flared geometry translate([0, 10, torch_height - hub_height/2 + 1]) cube([hub_width, hub_depth, hub_height], center=true); // Cable Routing Channel // Runs from the bottom of the pocket straight down through the base translate([0, 10, -5]) cylinder(h=torch_height + 10, d=cable_hole_diameter); // Top Screw Hole translate([0, -wall_plate_thickness - 1, 150]) rotate([-90, 0, 0]) cylinder(h=wall_plate_thickness + 2, d=4.5); // Top Countersink translate([0, -2, 150]) rotate([-90, 0, 0]) cylinder(h=2.01, d1=4.5, d2=8.5); // Bottom Screw Hole translate([0, -wall_plate_thickness - 1, -20]) rotate([-90, 0, 0]) cylinder(h=wall_plate_thickness + 2, d=4.5); // Bottom Countersink translate([0, -2, -20]) rotate([-90, 0, 0]) cylinder(h=2.01, d1=4.5, d2=8.5); }