aboutsummaryrefslogtreecommitdiff
path: root/ls47.scad
diff options
context:
space:
mode:
authorMirek Kratochvil <exa.exa@gmail.com>2026-10-29 21:59:11 +0100
committerMirek Kratochvil <exa.exa@gmail.com>2026-10-29 21:59:11 +0100
commita57b23e308bb5dd0846ad977dbf931aeef8ed42f (patch)
tree27ce30db55bc94d87d6c83f0973407a7b8ec30f1 /ls47.scad
parent74b7edfefcc51a7e199c2573dab4668a04642356 (diff)
downloadls47-a57b23e308bb5dd0846ad977dbf931aeef8ed42f.tar.gz
ls47-a57b23e308bb5dd0846ad977dbf931aeef8ed42f.tar.bz2
a bit of a clean-up
Diffstat (limited to 'ls47.scad')
-rw-r--r--ls47.scad91
1 files changed, 91 insertions, 0 deletions
diff --git a/ls47.scad b/ls47.scad
new file mode 100644
index 0000000..c77ad78
--- /dev/null
+++ b/ls47.scad
@@ -0,0 +1,91 @@
+
+// No license, but send me a hello if you use this for some good purpose.
+// -- Mirek Kratochvil <exa.exa@gmail.com>
+
+font = "FiraMono:style=Bold";
+
+//inch-sized tiles look imperial.
+tilesize=25.4;
+//you might like them a bit larger if you want to use this outdoors
+
+//distance between tiles
+off=tilesize*1.1;
+tileheight=tilesize/10;
+fontheight=tileheight*0.5;
+corner=tileheight*2;
+
+module arrow(n) {
+ if (n>=1)
+ for(i=[0:n-1]) translate([i-(n-1)/2,0,0])
+ polygon([[0.45,0],[0,0.7],[-0.45,0]]);
+}
+
+//this produces one tile
+module tilec(letter, x, y, c) {
+ xx = ((10-x)%7)-3;
+ yy = ((y+3)%7)-3;
+ dx = sign(xx);
+ dy = sign(yy);
+ translate([x*off,(6-y)*off,0]) {
+ difference() {
+ color(c) union() {
+ cube([tilesize,tilesize-corner,tileheight]);
+ translate([corner, tilesize-corner,0])
+ cube([tilesize-2*corner, corner, tileheight]);
+ translate([corner, tilesize-corner, 0])
+ cylinder(tileheight, corner, corner);
+ translate([tilesize-corner, tilesize-corner, 0])
+ cylinder(tileheight, corner, corner);
+ };
+ color("white") {
+ translate([tilesize*(0.5-dx*0.1),tilesize*(0.3-dy*0.1),tileheight*.5])
+ linear_extrude (height=tileheight)
+ text(letter, font=font, size=tilesize*.48,
+ halign="center", valign="baseline");
+ }
+ color("white")
+ translate([tilesize*(0.5+dx*0.3), tilesize*0.5, tileheight*.5])
+ scale(4*[dx,1,1])
+ rotate([0,0,-90])
+ linear_extrude(height=tileheight/4)
+ arrow(abs(xx));
+ color("white")
+ translate([tilesize*0.5, tilesize*(0.5+dy*0.3), tileheight*.5])
+ scale(4*[1,dy,1])
+ linear_extrude(height=tileheight/4)
+ arrow(abs(yy));
+ }
+ }
+}
+
+//tiles
+module tile(letter,x,y) {
+ tilec(letter,x,y,"darkgray");
+}
+
+module tiles(letters) {
+ for(i=[0,1,2,3,4,5,6]) for (j=[0,1,2,3,4,5,6]) {
+ tile(letters[i+7*j], i, j);
+ }
+}
+
+tiles(
+ ["_", "A", "B", "C", "D", "E", "F",
+ "G", "H", "I", "J", "K", "L", "M",
+ "N", "O", "P", "Q", "R", "S", "T",
+ "U", "V", "W", "X", "Y", "Z", ".",
+ ",", ":", "?", "!", "'", "(", ")",
+ "0", "1", "2", "3", "4", "5", "6",
+ "7", "8", "9", "+", "-", "*", "/"]
+);
+
+//the token
+translate([-off/2,off/2,0]) {
+ color("red") difference() {
+ cylinder(h=tileheight, d=tilesize);
+ translate([0,0,-.1])
+ cylinder(h=tileheight*1.2, d=tilesize-2*tileheight);
+ }
+}
+
+