$fn = 64; // --- Parameters --- // Base dimensions base_width = 40; base_height = 80; base_thickness = 8; // Hook dimensions stem_radius = 10; branch_radius = 7; tip_radius = 5; spread_x = 28; // Distance from center to hook tip hook_out_z = 42; // How far the hook extends from the wall hook_up_y = 35; // How high the hook goes // Mounting holes hole_dia = 5; hole_head_dia = 10; hole_spacing = 50; // --- Geometry --- difference() { union() { // Wall plate hull() { translate([0, base_height/2 - base_width/2, 0]) cylinder(r=base_width/2, h=base_thickness); translate([0, -(base_height/2 - base_width/2), 0]) cylinder(r=base_width/2, h=base_thickness); } // Main central stem hull() { translate([0, -5, 0]) cylinder(r=stem_radius, h=base_thickness); translate([0, 5, base_thickness + 12]) sphere(r=branch_radius); } // Left hook arm hull() { translate([0, 5, base_thickness + 12]) sphere(r=branch_radius); translate([-spread_x, 15, hook_out_z]) sphere(r=branch_radius); } // Left hook tip hull() { translate([-spread_x, 15, hook_out_z]) sphere(r=branch_radius); translate([-spread_x, hook_up_y, hook_out_z - 5]) sphere(r=tip_radius); } // Right hook arm hull() { translate([0, 5, base_thickness + 12]) sphere(r=branch_radius); translate([spread_x, 15, hook_out_z]) sphere(r=branch_radius); } // Right hook tip hull() { translate([spread_x, 15, hook_out_z]) sphere(r=branch_radius); translate([spread_x, hook_up_y, hook_out_z - 5]) sphere(r=tip_radius); } } // Top mounting hole translate([0, hole_spacing/2, -1]) { cylinder(r=hole_dia/2, h=base_thickness + 2); translate([0, 0, base_thickness - 2]) cylinder(r1=hole_dia/2, r2=hole_head_dia/2, h=3.1); } // Bottom mounting hole translate([0, -hole_spacing/2, -1]) { cylinder(r=hole_dia/2, h=base_thickness + 2); translate([0, 0, base_thickness - 2]) cylinder(r1=hole_dia/2, r2=hole_head_dia/2, h=3.1); } }