kerf = 0.02; thickness = 0.17; sf = 96; squareSize = 2 + kerf; ligatureWidth = 0.75; desiredSpacing = 0.125; slotLength = 0.5 - desiredSpacing / 2; chamferSize = 0.05; mm_per_inch = 25.4; module slotCutout() { square([thickness - kerf, slotLength * 2], center=true); rotate([0, 0, 45]) square(thickness - kerf + chamferSize, center = true); } module squarePiece () { difference() { square(squareSize, center=true); for(i = [0:3]) { rotate([0, 0, 90 * i]) translate([0, squareSize/2]) slotCutout(); } } } module straightLigature() { intersection() { squarePiece(); square([squareSize, ligatureWidth], center=true); } } module xLigature() { union() { straightLigature(); rotate([0, 0, 90]) straightLigature(); } } module lLigature() { ss = squareSize - (squareSize - ligatureWidth) / 2 ; intersection() { xLigature(); translate([(squareSize - ss) / 2, (squareSize - ss) / 2]) square([ss, ss], center=true); }; } module tLigature() { ss = squareSize - (squareSize - ligatureWidth) / 2 ; difference() { xLigature(); translate([0, -ss]) square(squareSize, center = true); } } scale([sf, sf]) translate([1, 1]) { translate([0, 0]) squarePiece(); translate([20, 12]) xLigature(); for(x = [0:5]) for(y = [0:3]) { translate([x * 2.125, y * 2.125]) squarePiece(); } translate([12.25, 6.375]) rotate([0, 0, -90]) for(x = [0:3]) for(y = [0:5]) { translate([x * 2.125, y * 0.8625]) straightLigature(); } translate([-0.625, 12.375]) rotate([0, 0, -90]) for(x = [0:2]) for(y = [0:3]) { translate([x * 1.8, y * 2.5]) { lLigature(); translate([0.875, 1.5]) rotate([0, 0, 180]) lLigature(); } } translate([10, 8.125]) for(x = [0:3]) for(y = [0:1]) { translate([x * 2.25, y * 2.375]) { tLigature(); translate([0.875, 1.5]) rotate([0, 0, 180]) tLigature(); } } translate([20, 0]) for(x=[0:0]) for(y=[0:4]) { translate([x * 2.125, y * 2.125]) xLigature(); } };