$fn = 64; // --- Parameters --- token_diameter = 42; // Fits standard large tokens (e.g., 40mm) token_thickness = 5; // Depth of the token recess holder_diameter = 80; // Overall diameter of the main body holder_height = 15; // Height of the main pedestal deco_diameter = 14; // Diameter of the perimeter pillars num_decorations = 8; // Number of perimeter pillars finger_slot_radius = 8; // Radius of the finger cutout // --- Geometry --- difference() { union() { // Main pedestal body cylinder(d1=holder_diameter + 5, d2=holder_diameter, h=holder_height); // Stepped decorative base cylinder(d1=holder_diameter + 15, d2=holder_diameter + 10, h=3); // Crown perimeter pillars for(i = [0 : num_decorations - 1]) { // Offset angle so the finger slot passes perfectly between pillars angle = (i * (360 / num_decorations)) + (180 / num_decorations); rotate([0, 0, angle]) translate([holder_diameter / 2, 0, 0]) union() { // Pillar body cylinder(d=deco_diameter, h=holder_height + 4); // Sphere finial translate([0, 0, holder_height + 4]) sphere(d=deco_diameter); } } // Inner raised lip around the token translate([0, 0, holder_height]) rotate_extrude() translate([(token_diameter / 2) + 5, 0, 0]) circle(d=4); } // Token recess translate([0, 0, holder_height - token_thickness]) cylinder(d=token_diameter, h=token_thickness + 10); // Finger slot for easy token removal // Oriented along Y-axis, cuts a smooth trough translate([0, 0, holder_height]) rotate([90, 0, 0]) cylinder(r=finger_slot_radius, h=holder_diameter + 40, center=true); // Center decorative cutout / emergency push-hole translate([0, 0, -1]) rotate([0, 0, 22.5]) cylinder(d=20, h=holder_height + 2, $fn=8); }