// FABULA open source storyteller enclosure // Global dimensions, change here width = 120; height = 60; depth = 40; screw_diameter = 3; // Internal global variables rounded_edge_diameter = height; box_cut_height = 10; standoff_diameter=screw_diameter*3; // Screw standoff module standoff() { cylinder(h = depth, d = standoff_diameter, center = true); } // Screw hole, to be subtracted from standoff and box module screw_hole() { // Hole where the screw will thread into cylinder(h = depth - 2, d = screw_diameter, center = true); // Hole where the screw will pass with slack, without threading (in the lid) translate([0, 0, depth/2 - box_cut_height/2]) { cylinder(h = box_cut_height + 2, d = screw_diameter*1.5, center = true); } // Screw head bevel bevel_depth = 1; translate([0, 0, depth/2 - bevel_depth/2 + 0.1]) { cylinder(h = bevel_depth, d2 = screw_diameter * 2.5, d1 = screw_diameter*1.5, center = true); } } // Main body module main_body() { module half_body() { cube([width - rounded_edge_diameter/2, height/2, depth]); cylinder(h = depth, d = rounded_edge_diameter, $fn=256); } union() { translate([-(width - rounded_edge_diameter)/2, 0, -depth/2]) { half_body(); } translate([(width - rounded_edge_diameter)/2, 0, -depth/2]) { mirror([1, 0, 0]) { mirror([0, 1, 0]) { half_body(); } } } } } // Closed Box module closed_box() { // Hollow box difference() { union() { difference() { main_body(); scale([0.95, 0.95, 0.95]) { main_body(); } } // Screws standoffs near curved edges translate([width/2 - rounded_edge_diameter/2, -height/2 + standoff_diameter/2, 0]) { standoff(); } translate([-width/2 + rounded_edge_diameter/2, height/2 - standoff_diameter/2, 0]) { standoff(); } // Screws standoff near sharp edges translate([-width/2 + standoff_diameter/2, -height/2 + standoff_diameter/2, 0]) { standoff(); } translate([width/2 - standoff_diameter/2, height/2 - standoff_diameter/2, 0]) { standoff(); } } // Screw holes near curved edges translate([width/2 - rounded_edge_diameter/2, -height/2 + standoff_diameter/2, 0]) { screw_hole(); } translate([-width/2 + rounded_edge_diameter/2, height/2 - standoff_diameter/2, 0]) { screw_hole(); } // Screws holes near sharp edges translate([-width/2 + standoff_diameter/2, -height/2 + standoff_diameter/2, 0]) { screw_hole(); } translate([width/2 - standoff_diameter/2, height/2 - standoff_diameter/2, 0]) { screw_hole(); } } } // Lower box module box() { difference() { closed_box(); translate([0, 0, depth - box_cut_height]) { cube([width*2, height*2, depth], true); } } } // Upper cap module cap() { // TODO: Flangia interna che non interferisca con gli standoff difference() { closed_box(); translate([0, 0, - box_cut_height]) { cube([width*2, height*2, depth], true); } } } closed_box();