$fn=64; // --- Parameters --- // Standard metric Allen key sizes keys = [1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 8.0, 10.0]; tolerance = 0.6; // Clearance for easy insertion spacing = 7; // Gap between holes wall = 4; // Minimum wall thickness base_h = 4; // Solid base thickness under the holes // Calculate X positions for each key recursively function x_pos(i) = i == 0 ? 0 : x_pos(i-1) + (keys[i-1] + keys[i])/2 + spacing; // Pre-calculate dimensions max_key = keys[len(keys)-1]; depth = max_key + wall * 2; length = x_pos(len(keys)-1); difference() { // Main slanted body hull() { // Small end translate([-keys[0]/2 - wall, -depth/2, 0]) cube([keys[0] + wall*2, depth, 15]); // Large end translate([length - max_key/2 - wall, -depth/2, 0]) cube([max_key + wall*2, depth, 40]); } // Tool holes and text labels for(i = [0 : len(keys)-1]) { x = x_pos(i); d = keys[i] + tolerance; // Key hole translate([x, 0, base_h]) cylinder(d=d, h=50); // Text label (engraved on the front face) translate([x, -depth/2 + 1, 6]) rotate([90, 0, 0]) linear_extrude(2) text( str(keys[i]), size=3.5, halign="center", valign="center", font="sans-serif:style=Bold" ); } }