$fa = 1; $fs = $preview ? 2 : 0.5; // Define dimensions tube_diameter = 6; tube_length = 14; distance_between_rows = 14; distance_between_cols = 10; distance_to_edge=10; n_rows = 3; n_cols = 4; box_wall_thickness = 2; lid_thickness = 2; interlock_height = 3; interlock_width = 3; text_dist = tube_diameter/2 + 1; text_depth = 1; tolerance=1; // Calculate derived dimensions box_inner_width = (n_rows-1)*distance_between_rows + 2*distance_to_edge; box_inner_length = (n_cols-1) *distance_between_cols + 2*distance_to_edge; box_outer_width = box_inner_width + 2 * box_wall_thickness; box_outer_length = box_inner_length + 2 * box_wall_thickness; // Create the box module box() { difference() { cube([box_outer_length, box_outer_width, tube_length]); translate([box_wall_thickness,box_wall_thickness,tube_length-3]) cube([box_inner_length, box_inner_width, 3]); for (row = [0:n_rows-1]) { for (col = [0:n_cols-1]) { translate([col * (distance_between_cols)+distance_to_edge+box_wall_thickness, row * (distance_between_rows)+distance_to_edge+box_wall_thickness, 3]) cylinder(h=tube_length, d=tube_diameter, center=false); } } for (row = [0:n_rows-1]) { for (col = [0:n_cols-1]) { translate([col * (distance_between_cols)+distance_to_edge+box_wall_thickness, row * (distance_between_rows)+distance_to_edge+box_wall_thickness+text_dist, tube_length-3-text_depth]) linear_extrude(height=text_depth) text(str((n_rows+1)*(row)+(col+1)), font = "Quicksand:style=Bold", size=5, halign="center"); } } } } module lid() { difference() { union() { cube([box_outer_length, box_outer_width, tube_length-2]); translate([box_wall_thickness+tolerance/2, box_wall_thickness+tolerance/2,0]) cube([box_inner_length-tolerance, box_inner_width-tolerance, tube_length]); } for (row = [0:n_rows-1]) { for (col = [0:n_cols-1]) { translate([col * (distance_between_cols)+distance_to_edge+box_wall_thickness, row * (distance_between_rows)+distance_to_edge+box_wall_thickness, 3]) cylinder(h=tube_length, d=tube_diameter, center=false); } } } } // Assemble the box, lid, and interlock box(); translate([n_cols*distance_between_cols +20,0,0]) lid(); //interlock();