kerf = 0.136; matGirth = 3; indentDepth = 4; indentNum = 6; rotation = 360 / indentNum; baseRadius = 20; pieceCount = 5; for (i = [0 : pieceCount] ) { translate([baseRadius * 7 * i, 0, 0]) figArray(1); } for (i = [0 : pieceCount - 1] ) { translate([baseRadius * 10 * i, baseRadius * 3, 0]) figArray(1.5); } for (i = [0 : pieceCount - 2] ) { translate([baseRadius * 13 * i, baseRadius * 7, 0]) figArray(2); } module basePiece(size) { radius = baseRadius * size; module indents() { for (i = [0 : indentNum - 1]) { rotate(rotation * i + 180) translate([0, radius - indentDepth / 2, 0]) square([matGirth, indentDepth], true); } } rotate(30) difference() { circle(radius); indents(); } } module joint(type, baseRadius) { if (type == 1) { square([matGirth, baseRadius / 2], true); } else if (type == 2) { square([matGirth, baseRadius - matGirth], true); } else if (type == 3) { square([matGirth, (baseRadius * 2) - (baseRadius / 2)], true); } else { echo("Error: Type number not allowed"); } } module figArray(size) { radius = baseRadius * size; module fig1(size, radius) { difference() { basePiece(size); translate([-(radius / 2), 0, 0]) rotate(90) joint(2, radius); translate([+(radius / 2), 0, 0]) rotate(-90) joint(2, radius); translate([0, -radius + radius / 4, 0]) joint(1, radius); } } module fig2(size, radius) { difference() { basePiece(size); translate([0, radius / 4, 0]) joint(3, radius); } } module fig3(size, radius) { difference() { basePiece(size); translate([0, radius / 4, 0]) joint(3, radius); translate([radius - indentDepth - 1.5, 0, 0]) rotate(90) joint(1, radius); } } translate([0, 0, 0]) fig1(size, radius); translate([radius * 2 + 5, 0, 0]) fig2(size, radius); translate([radius * 4 + 10, 0, 0]) fig3(size, radius); }