include use use use module front_connector_half( border_side = false, border_top = false, border_bottom = false ) difference() { union() { connector_half(border_side, border_top, border_bottom); // vertical thread bold receiver (extremal) if (!border_side) translate([tray_width/2 - bar_thickness, bar_thickness, tray_height-bar_thickness]) cube([bar_thickness, bar_thickness, bar_thickness]); } // receiver for rail if (!border_side) translate([bar_thickness/2 - rail_thickness, 0, bar_thickness - rail_thickness]) rail(); // holes for thread rods (horizontal, vertical) translate([0, bar_thickness / 2, 0]) cylinder(h = tray_height, r = (rod_diameter + pla_epsilon) / 2, $fs=0.1); translate([0, bar_thickness * 1.5, tray_height - bar_thickness / 2]) rotate([0, 90, 0]) cylinder(h = tray_width / 2, r = (rod_diameter + pla_epsilon) / 2, $fs=0.1); // hole for nut on the bottom of the vertical rod if (border_bottom) translate([0, bar_thickness / 2, 0]) cylinder(h=nut_height, r=nut_diameter/2 + pla_epsilon, $fs=0.1); // female downward positioning nippel if (!border_top) translate([rail_width, bar_thickness / 2, tray_height]) nipple(pla_epsilon); } module front_connector( border_left = false, border_right = false, border_top = false, border_bottom = false ) { difference() { union() { mirror() front_connector_half(border_left, border_top, border_bottom); front_connector_half(border_right, border_top, border_bottom); } // 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(); } front_connector();