infty = 100; eps = 0.01; wall = 1.5; lens_size = 9.2; lens_depth = 3; lens_side = 0.9; lens_up_angle = 0; cable_w = 7; stem_w = 2.75; slot_l = 8; slot_x_off = 6; slot_angle = 10; slot_y_angle = 10; module body() { intersection() { hull() { // lens outer body rotate([lens_up_angle, 0, 0]) translate([-lens_size/2-wall, 0, 0]) cube([lens_size+2*wall, 2*wall+lens_depth, wall+lens_size/2]); // stem outer body rotate([0, 0, slot_angle]) translate([-stem_w-wall-slot_x_off, -slot_l, 0]) cube([stem_w + 2*wall, slot_l, wall + lens_size/2]); } translate([-infty/2, -infty/2, 0]) cube([infty, infty, wall+lens_size/2]); } } difference() { body(); // lens body rotate([lens_up_angle, 0, 0]) translate([-lens_size/2, wall, wall+(wall+lens_depth)*tan(-lens_angle)]) cube([lens_size, lens_depth, lens_size + eps]); // lens front rotate([lens_up_angle, 0, 0]) translate([-lens_size/2+lens_side, wall, wall+(wall+lens_depth)*tan(-lens_angle)]) cube([lens_size-2*lens_side, lens_depth+wall+eps, lens_size + wall + 2*eps]); // cable hole translate([-cable_w/2, wall, -eps]) cube([cable_w, lens_depth+wall+eps, lens_size+wall+2*eps]); rotate([0, 0, slot_angle]) rotate([0, slot_y_angle, 0]) translate([-stem_w-slot_x_off, -infty/2, lens_size/2-1.5-infty]) cube([stem_w, infty, infty]); }