From bc6c4822eb05f35358d02e0e498469884d4529cf Mon Sep 17 00:00:00 2001 From: s3lph <s3lph@kabelsalat.ch> Date: Sun, 30 Mar 2025 13:13:20 +0200 Subject: [PATCH] feat: support alphabets smaller than 26, automatically determine suitable font size --- key_dial.scad | 22 +++++++++++++--------- lockpuzzle.scad | 7 +++++-- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/key_dial.scad b/key_dial.scad index 3a1c60b..0737dd7 100644 --- a/key_dial.scad +++ b/key_dial.scad @@ -1,25 +1,26 @@ -module key_dial(alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ", key="A", width=7, dia=50, thick=5.5, key_width=4, key_height=3, text_depth=1, text_width=4, antipick=1.5, tolerance = 0.2, $fn = 60) { +module key_dial(alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ", key="C", width=7, dia=50, thick=5.5, key_width=4, key_height=3, text_depth=1, font_size=-1, antipick=1.5, tolerance = 0.2, $fn = 60) { key_indices = search(key, alphabet, 0); assert(len(key_indices[0]) == 1, "key character not unique"); key_index = key_indices[0][0]; + _font_size = font_size > 0 ? font_size : min(dia*PI/len(alphabet)/1.6, dia/10); rotate([-0.5/len(alphabet)*360,0,0]) { difference() { rotate([0,90,0]) { - cylinder($fn=len(alphabet), h=width, d=dia, center=true); + cylinder($fn=$fn, h=width, d=dia, center=true); } // inner ring rotate([0,90,0]) { - cylinder($fn=60, h=width+2, d=dia-thick*2, center=true); + cylinder($fn=$fn, h=width+2, d=dia-thick*2, center=true); } // key - rotate([((0.5)/len(alphabet)) * 360,0,0]) { + rotate([((0.5+key_index)/len(alphabet)) * 360,0,0]) { translate([0,0,dia/2-thick]) { cube([width+2, key_width, key_height*2], center=true); } } // anti-picking keys - for (i = [1:len(alphabet)-1]) { + for (i = [1:len(alphabet)]) { rotate([((i+0.5)/len(alphabet)) * 360,0,0]) { translate([width/2,0,dia/2-thick]) { cube([2*antipick, key_width, key_height*2], center=true); @@ -29,9 +30,12 @@ module key_dial(alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ", key="A", width=7, dia=50, // text for (i = [0:len(alphabet)]) { rotate([((i+0.5)/len(alphabet)) * 360,0,0]) { - translate([0,0,dia/2-text_depth]) { + translate([-width/2-1,-dia/2,dia/2-0.3]) { + cube([width+2,dia,5]); + } + translate([0,0,dia/2-text_depth-0.3]) { linear_extrude(height=text_depth+1, convexity=3) { - text(alphabet[(i+key_index)%len(alphabet)], size=text_width, halign="center", valign="center"); + text(alphabet[i], size=_font_size, halign="center", valign="center"); } } } @@ -44,10 +48,10 @@ module key_dial(alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ", key="A", width=7, dia=50, // DEFAULTS FOR COMMAND LINE INVOCATION ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -KEY = "A"; +KEY = "C"; DIAMETER = 50; TOLERANCE = 0.2; -FN = 60; +FN = 120; INDEX = 0; rotate([0,-90,0]) { diff --git a/lockpuzzle.scad b/lockpuzzle.scad index 8d5ff23..01c0164 100644 --- a/lockpuzzle.scad +++ b/lockpuzzle.scad @@ -5,12 +5,15 @@ use <case.scad>; use <plug.scad>; -module lock(alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ", password="CHAOS", text_width=4, diameter=50, tolerance=0.2, $fn= 60) { +module lock(alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ", password="CHAOS", diameter=50, tolerance=0.2, $fn= 60) { n = len(password); + key_indices=search(password, alphabet); for (i = [0:n-1]) { - translate([i*10,0,0]) key_dial(alphabet, key=password[i], dia=diameter, text_width=text_width); + rotate([-key_indices[i]/len(alphabet)*360,0,0]) { + translate([i*10,0,0]) key_dial(alphabet, key=password[i], dia=diameter); + } } for (i = [0:n]) {