$fn = 64; // --- Parameters --- // Wall Plate Dimensions wall_plate_height = 120; wall_plate_width = 40; wall_plate_thickness = 8; corner_radius = 5; // Arm Dimensions arm_length = 90; // Distance from wall to center of stack arm_width = 16; arm_height = 20; // Collar/Holder Dimensions collar_od = 45; collar_id = 26; // 26mm fits a standard 1-inch (25.4mm) PVC pipe/pole collar_height = 30; // Mounting Hardware screw_d = 5.5; // M5 screw screw_head_d = 12; screw_head_h = 6; screw_offset = 45; // Distance from center for top/bottom screws set_screw_d = 4.5; // M4 set screw for the collar // --- Main Module --- module plantstack_bracket() { difference() { union() { // 1. Wall Plate (Rounded) hull() { for (z = [wall_plate_height/2 - corner_radius, -wall_plate_height/2 + corner_radius]) { for (y = [wall_plate_width/2 - corner_radius, -wall_plate_width/2 + corner_radius]) { translate([wall_plate_thickness/2, y, z]) rotate([0, 90, 0]) cylinder(h=wall_plate_thickness, r=corner_radius, center=true); } } } // 2. Main Horizontal Arm // Spans from the wall plate to the center of the collar translate([arm_length/2, 0, 0]) cube([arm_length, arm_width, arm_height], center=true); // 3. Support Gussets (Top and Bottom for symmetric strength) for (z_mult = [1, -1]) { hull() { // Attach to wall plate (slightly embedded for manifoldness) translate([wall_plate_thickness/2, 0, z_mult * 25]) cube([wall_plate_thickness + 0.2, arm_width, 10], center=true); // Attach to arm translate([arm_length - collar_od/2 - 10, 0, z_mult * (arm_height/2 - 0.1)]) cube([20, arm_width, 0.2], center=true); } } // 4. Pole Collar translate([arm_length, 0, 0]) cylinder(h=collar_height, d=collar_od, center=true); } // --- Subtractions (Holes) --- // Central Pole Hole translate([arm_length, 0, 0]) cylinder(h=collar_height + 2, d=collar_id, center=true); // Wall Mounting Screw Holes for (z = [screw_offset, -screw_offset]) { translate([0, 0, z]) { // Screw shaft translate([wall_plate_thickness/2, 0, 0]) rotate([0, 90, 0]) cylinder(h=wall_plate_thickness + 5, d=screw_d, center=true); // Countersink / Screw head recess translate([wall_plate_thickness - screw_head_h, 0, 0]) rotate([0, 90, 0]) cylinder(h=screw_head_h + 1, d1=screw_d, d2=screw_head_d); } } // Set Screw Hole (Front of collar to secure the pole) translate([arm_length + collar_od/2, 0, 0]) rotate([0, 90, 0]) cylinder(h=collar_od/2, d=set_screw_d, center=true); } } // Render the bracket plantstack_bracket();