$fn = 64; // --- Parameters --- station_width = 160; station_depth = 45; station_height = 110; wall_thickness = 8; tube_diameter = 23; // Sized to fit standard 20mm to 22mm glass test tubes num_tubes = 3; tube_spacing = 45; module propagation_station() { union() { // Extended base footprint for added stability translate([0, 0, wall_thickness/4]) cube([station_width + 15, station_depth + 15, wall_thickness/2], center=true); difference() { // Main rectangular frame translate([0, 0, station_height/2]) cube([station_width, station_depth, station_height], center=true); // Inner frame cutout (creates the open front and back) translate([0, 0, station_height/2]) cube([ station_width - wall_thickness * 2, station_depth + 2, station_height - wall_thickness * 2 ], center=true); // Tube holes and resting recesses for (i = [0 : num_tubes - 1]) { x_pos = (i - (num_tubes - 1) / 2) * tube_spacing; // Top holes (pass-through for inserting tubes) translate([x_pos, 0, station_height - wall_thickness - 1]) cylinder(h=wall_thickness + 2, d=tube_diameter); // Bottom recesses (half-depth cuts to hold the base of the tubes) translate([x_pos, 0, wall_thickness/2]) cylinder(h=wall_thickness, d=tube_diameter); } } } } // Render the model propagation_station();