$fn = 64; // --- Parameters --- // Hex grid mounting parameters (Standard 20mm flat-to-flat, e.g., Honeycomb Storage Wall) hex_flat_to_flat = 20; hex_depth = 8; tolerance = 0.2; // Base plate parameters base_thickness = 3; base_padding = 8; // Eyeglasses holder parameters prong_spacing = 26; prong_length = 35; prong_base_dia = 14; prong_tip_dia = 8; hook_height = 12; // --- Modules --- module hex_mount() { // Calculate circumscribed radius for the hexagon hex_r = (hex_flat_to_flat - tolerance) / sqrt(3); // Hexagonal peg (extending backwards into the wall) translate([0, 0, -hex_depth]) rotate([0, 0, 30]) cylinder(r=hex_r, h=hex_depth, $fn=6); } module base_plate() { base_r = (hex_flat_to_flat / sqrt(3)) + base_padding; // Thematic hexagonal base plate rotate([0, 0, 30]) cylinder(r=base_r, h=base_thickness, $fn=6); // Beveled edge for aesthetics translate([0, 0, base_thickness]) rotate([0, 0, 30]) cylinder(r1=base_r, r2=base_r - 1.5, h=1.5, $fn=6); } module holder_arm() { // Main extending arm (tapered for strength) hull() { translate([0, 0, base_thickness]) cylinder(d=prong_base_dia, h=0.1); translate([0, -2, base_thickness + prong_length]) sphere(d=prong_tip_dia); } // Upward curved hook to keep glasses from sliding off hull() { translate([0, -2, base_thickness + prong_length]) sphere(d=prong_tip_dia); translate([0, hook_height, base_thickness + prong_length + 3]) sphere(d=prong_tip_dia); } } // --- Main Assembly --- union() { hex_mount(); base_plate(); // Left holding arm translate([-prong_spacing/2, 0, 0]) holder_arm(); // Right holding arm translate([prong_spacing/2, 0, 0]) holder_arm(); }