$fn = 64; // --- Parameters --- // Base plate dimensions base_width = 35; base_height = 90; base_thickness = 6; // Mounting holes hole_dist = 60; hole_dia = 5; screw_head_dia = 10; countersink_depth = 2.5; // Hook geometry stem_dia = 18; stem_length = 40; hook_spread = 70; // Distance between left and right hooks hook_up_length = 25; // How far the hooks curve upwards hook_dia = 14; // Thickness of the hook arms tip_dia = 18; // Enlarged spherical tips to prevent slipping hook_outward_angle_z = 12; // Outward tilt of the hooks // --- Main Assembly --- union() { difference() { base_plate(); screw_holes(); } stem(); arms(); } // --- Modules --- module base_plate() { // Pill-shaped base plate hull() { translate([0, base_height/2 - base_width/2, 0]) cylinder(d=base_width, h=base_thickness); translate([0, -(base_height/2 - base_width/2), 0]) cylinder(d=base_width, h=base_thickness); } } module screw_holes() { // Top screw hole with countersink translate([0, hole_dist/2, -1]) cylinder(d=hole_dia, h=base_thickness + 2); translate([0, hole_dist/2, base_thickness - countersink_depth]) cylinder(d1=hole_dia, d2=screw_head_dia, h=countersink_depth + 0.1); // Bottom screw hole with countersink translate([0, -hole_dist/2, -1]) cylinder(d=hole_dia, h=base_thickness + 2); translate([0, -hole_dist/2, base_thickness - countersink_depth]) cylinder(d1=hole_dia, d2=screw_head_dia, h=countersink_depth + 0.1); } module stem() { z_center = stem_length - hook_dia/2; // Central post transitioning smoothly from the base hull() { cylinder(d=stem_dia + 10, h=base_thickness); translate([0, 0, z_center]) sphere(d=stem_dia); } } module arms() { z_center = stem_length - hook_dia/2; end_z = z_center + hook_outward_angle_z; // Left arm extending outward hull() { translate([0, 0, z_center]) sphere(d=stem_dia); translate([-hook_spread/2, 0, z_center]) sphere(d=hook_dia); } // Left arm extending upward and slightly away from wall hull() { translate([-hook_spread/2, 0, z_center]) sphere(d=hook_dia); translate([-hook_spread/2, hook_up_length, end_z]) sphere(d=tip_dia); } // Right arm extending outward hull() { translate([0, 0, z_center]) sphere(d=stem_dia); translate([hook_spread/2, 0, z_center]) sphere(d=hook_dia); } // Right arm extending upward and slightly away from wall hull() { translate([hook_spread/2, 0, z_center]) sphere(d=hook_dia); translate([hook_spread/2, hook_up_length, end_z]) sphere(d=tip_dia); } }