// common base module for front and back connector include use use module connector_half( border_side = false, border_top = false, border_bottom = false ) difference() { union() { // vertical bar cube([bar_thickness/2, bar_thickness, tray_height]); if (!border_side) { // upper horizontal bar translate([0, 0, tray_height - bar_thickness]) cube([tray_width / 2, bar_thickness, bar_thickness]); // lower horizontal bar cube([bar_thickness/2 + rail_width + pla_epsilon, bar_thickness, bar_thickness]); } // male downward positioning nippel if (!border_bottom && !border_side) translate([rail_width, bar_thickness / 2, 0]) nipple(); } // receiver for rail if (!border_side) translate([bar_thickness/2 - rail_thickness, 0, bar_thickness - rail_thickness]) rail(); // female downward positioning nippel if (!border_top) translate([rail_width, bar_thickness / 2, tray_height]) nipple(pla_epsilon); } module connector( border_left = false, border_right = false, border_top = false, border_bottom = false ) { difference() { children(); // female leftward positioning nippel if (!border_left) translate([-tray_width/2, bar_thickness / 2, tray_height - bar_thickness / 2]) rotate([0, 270, 0]) nipple(pla_epsilon); } // male rightward positioning nippel if (!border_right) translate([tray_width / 2, bar_thickness / 2, tray_height - bar_thickness / 2]) rotate([0, 270, 0]) nipple(); }