module example006() { module edgeprofile() { render(convexity = 2) difference() { cube([20, 20, 150], center = true); translate([-10, -10, 0]) cylinder(h = 80, r = 10, center = true); translate([-10, -10, +40]) sphere(r = 10); translate([-10, -10, -40]) sphere(r = 10); } } difference() { cube(100, center = true); for (rot = [ [0, 0, 0], [1, 0, 0], [0, 1, 0] ]) { rotate(90, rot) for (p = [[+1, +1, 0], [-1, +1, 90], [-1, -1, 180], [+1, -1, 270]]) { translate([ p[0]*50, p[1]*50, 0 ]) rotate(p[2], [0, 0, 1]) edgeprofile(); } } for (i = [ [ 0, 0, [ [0, 0] ] ], [ 90, 0, [ [-20, -20], [+20, +20] ] ], [ 180, 0, [ [-20, -25], [-20, 0], [-20, +25], [+20, -25], [+20, 0], [+20, +25] ] ], [ 270, 0, [ [0, 0], [-25, -25], [+25, -25], [-25, +25], [+25, +25] ] ], [ 0, 90, [ [-25, -25], [0, 0], [+25, +25] ] ], [ 0, -90, [ [-25, -25], [+25, -25], [-25, +25], [+25, +25] ] ] ]) { rotate(i[0], [0, 0, 1]) rotate(i[1], [1, 0, 0]) translate([0, -50, 0]) for (j = i[2]) translate([j[0], 0, j[1]]) sphere(10); } } } example006();